--- /dev/null
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ copyright (c) 2009 by Bruce Korb - all rights reserved
+ 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) by Bruce Korb - all rights reserved
+
+ 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 <http://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) by Bruce Korb - all rights reserved
+ 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
+<http://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
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+++ /dev/null
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-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 this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-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
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser 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 Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "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
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY 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
-LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey 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 library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
--- /dev/null
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ copyright (c) 2009 by Bruce Korb - all rights reserved
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser 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
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
endif
libopts_la_SOURCES = libopts.c
libopts_la_CPPFLAGS = -I$(top_srcdir)
-libopts_la_LDFLAGS = -version-info 29:0:4
+libopts_la_LDFLAGS = -version-info 32:1:7
EXTRA_DIST = \
- COPYING.lgpl COPYING.mbsd MakeDefs.inc \
- README autoopts/options.h autoopts/usage-txt.h \
- autoopts.c autoopts.h boolean.c \
- compat/windows-config.h compat/compat.h compat/pathfind.c \
- compat/snprintf.c compat/strdup.c compat/strchr.c \
- configfile.c cook.c enumeration.c \
- environment.c genshell.c genshell.h \
+ COPYING.gplv3 COPYING.lgplv3 COPYING.mbsd \
+ MakeDefs.inc README ag-char-map.h \
+ autoopts/options.h autoopts/usage-txt.h autoopts.c \
+ autoopts.h boolean.c compat/windows-config.h \
+ compat/compat.h compat/pathfind.c compat/snprintf.c \
+ compat/strdup.c compat/strchr.c configfile.c \
+ cook.c enumeration.c environment.c \
+ file.c genshell.c genshell.h \
load.c m4/libopts.m4 m4/liboptschk.m4 \
makeshell.c nested.c numeric.c \
- pgusage.c proto.h putshell.c \
+ parse-duration.c parse-duration.h pgusage.c \
+ proto.h putshell.c reset.c \
restore.c save.c sort.c \
stack.c streqvcmp.c text_mmap.c \
- tokenize.c usage.c version.c
+ time.c tokenize.c usage.c \
+ value-type.c value-type.h version.c \
+ xat-attribute.c xat-attribute.h
--- /dev/null
+/*
+ * Character mapping generated 05/16/09 08:16:06
+ *
+ * This file contains the character classifications
+ * used by AutoGen and AutoOpts for identifying tokens.
+ */
+#ifndef AG_CHAR_MAP_H_GUARD
+#define AG_CHAR_MAP_H_GUARD 1
+
+#ifdef HAVE_CONFIG_H
+# if defined(HAVE_INTTYPES_H)
+# include <inttypes.h>
+# elif defined(HAVE_STDINT_H)
+# include <stdint.h>
+# else
+# error "no int-types header."
+# choke-me-now.
+# endif
+#else
+# ifdef __sun
+# include <inttypes.h>
+# else
+# include <stdint.h>
+# endif
+#endif
+
+#if 0 /* mapping specification source (from autogen.map) */
+//
+// %guard autoopts_internal
+// %file ag-char-map.h
+// %table opt-char-cat
+//
+// %comment
+// This file contains the character classifications
+// used by AutoGen and AutoOpts for identifying tokens.
+// %
+//
+// lower-case "a-z"
+// upper-case "A-Z"
+// alphabetic +lower-case +upper-case
+// oct-digit "0-7"
+// dec-digit "89" +oct-digit
+// hex-digit "a-fA-F" +dec-digit
+// alphanumeric +alphabetic +dec-digit
+// var-first "_" +alphabetic
+// variable-name +var-first +dec-digit
+// option-name "^-" +variable-name
+// value-name ":" +option-name
+// horiz-white "\t "
+// compound-name "[.]" +value-name +horiz-white
+// whitespace "\v\f\r\n\b" +horiz-white
+// unquotable "!-~" -"\"#(),;<=>[\\]`{}?*'"
+// end-xml-token "/>" +whitespace
+// graphic "!-~"
+// plus-n-space "+" +whitespace
+// punctuation "!-~" -alphanumeric -"_"
+// suffix "-._" +alphanumeric
+// suffix-fmt "%/" +suffix
+// false-type "nNfF0\x00"
+//
+#endif /* 0 -- mapping spec. source */
+
+typedef uint32_t opt_char_cat_mask_t;
+extern opt_char_cat_mask_t const opt_char_cat[128];
+
+static inline int is_opt_char_cat_char(char ch, opt_char_cat_mask_t mask) {
+ unsigned int ix = (unsigned char)ch;
+ return ((ix < 0x7F) && ((opt_char_cat[ix] & mask) != 0)); }
+
+#define IS_LOWER_CASE_CHAR(_c) is_opt_char_cat_char((_c), 0x00001)
+#define IS_UPPER_CASE_CHAR(_c) is_opt_char_cat_char((_c), 0x00002)
+#define IS_ALPHABETIC_CHAR(_c) is_opt_char_cat_char((_c), 0x00003)
+#define IS_OCT_DIGIT_CHAR(_c) is_opt_char_cat_char((_c), 0x00004)
+#define IS_DEC_DIGIT_CHAR(_c) is_opt_char_cat_char((_c), 0x0000C)
+#define IS_HEX_DIGIT_CHAR(_c) is_opt_char_cat_char((_c), 0x0001C)
+#define IS_ALPHANUMERIC_CHAR(_c) is_opt_char_cat_char((_c), 0x0000F)
+#define IS_VAR_FIRST_CHAR(_c) is_opt_char_cat_char((_c), 0x00023)
+#define IS_VARIABLE_NAME_CHAR(_c) is_opt_char_cat_char((_c), 0x0002F)
+#define IS_OPTION_NAME_CHAR(_c) is_opt_char_cat_char((_c), 0x0006F)
+#define IS_VALUE_NAME_CHAR(_c) is_opt_char_cat_char((_c), 0x000EF)
+#define IS_HORIZ_WHITE_CHAR(_c) is_opt_char_cat_char((_c), 0x00100)
+#define IS_COMPOUND_NAME_CHAR(_c) is_opt_char_cat_char((_c), 0x003EF)
+#define IS_WHITESPACE_CHAR(_c) is_opt_char_cat_char((_c), 0x00500)
+#define IS_UNQUOTABLE_CHAR(_c) is_opt_char_cat_char((_c), 0x00800)
+#define IS_END_XML_TOKEN_CHAR(_c) is_opt_char_cat_char((_c), 0x01500)
+#define IS_GRAPHIC_CHAR(_c) is_opt_char_cat_char((_c), 0x02000)
+#define IS_PLUS_N_SPACE_CHAR(_c) is_opt_char_cat_char((_c), 0x04500)
+#define IS_PUNCTUATION_CHAR(_c) is_opt_char_cat_char((_c), 0x08000)
+#define IS_SUFFIX_CHAR(_c) is_opt_char_cat_char((_c), 0x1000F)
+#define IS_SUFFIX_FMT_CHAR(_c) is_opt_char_cat_char((_c), 0x3000F)
+#define IS_FALSE_TYPE_CHAR(_c) is_opt_char_cat_char((_c), 0x40000)
+
+#ifdef AUTOOPTS_INTERNAL
+opt_char_cat_mask_t const opt_char_cat[128] = {
+ /*x00*/ 0x40000, /*x01*/ 0x00000, /*x02*/ 0x00000, /*x03*/ 0x00000,
+ /*x04*/ 0x00000, /*x05*/ 0x00000, /*x06*/ 0x00000, /*\a */ 0x00000,
+ /*\b */ 0x00400, /*\t */ 0x00100, /*\n */ 0x00400, /*\v */ 0x00400,
+ /*\f */ 0x00400, /*\r */ 0x00400, /*x0E*/ 0x00000, /*x0F*/ 0x00000,
+ /*x10*/ 0x00000, /*x11*/ 0x00000, /*x12*/ 0x00000, /*x13*/ 0x00000,
+ /*x14*/ 0x00000, /*x15*/ 0x00000, /*x16*/ 0x00000, /*x17*/ 0x00000,
+ /*x18*/ 0x00000, /*x19*/ 0x00000, /*x1A*/ 0x00000, /*x1B*/ 0x00000,
+ /*x1C*/ 0x00000, /*x1D*/ 0x00000, /*x1E*/ 0x00000, /*x1F*/ 0x00000,
+ /* */ 0x00100, /* ! */ 0x0A800, /* " */ 0x0A000, /* # */ 0x0A000,
+ /* $ */ 0x0A800, /* % */ 0x2A800, /* & */ 0x0A800, /* ' */ 0x0A000,
+ /* ( */ 0x0A000, /* ) */ 0x0A000, /* * */ 0x0A000, /* + */ 0x0E800,
+ /* , */ 0x0A000, /* - */ 0x1A840, /* . */ 0x1AA00, /* / */ 0x2B800,
+ /* 0 */ 0x42804, /* 1 */ 0x02804, /* 2 */ 0x02804, /* 3 */ 0x02804,
+ /* 4 */ 0x02804, /* 5 */ 0x02804, /* 6 */ 0x02804, /* 7 */ 0x02804,
+ /* 8 */ 0x02808, /* 9 */ 0x02808, /* : */ 0x0A880, /* ; */ 0x0A000,
+ /* < */ 0x0A000, /* = */ 0x0A000, /* > */ 0x0B000, /* ? */ 0x0A000,
+ /* @ */ 0x0A800, /* A */ 0x02812, /* B */ 0x02812, /* C */ 0x02812,
+ /* D */ 0x02812, /* E */ 0x02812, /* F */ 0x42812, /* G */ 0x02802,
+ /* H */ 0x02802, /* I */ 0x02802, /* J */ 0x02802, /* K */ 0x02802,
+ /* L */ 0x02802, /* M */ 0x02802, /* N */ 0x42802, /* O */ 0x02802,
+ /* P */ 0x02802, /* Q */ 0x02802, /* R */ 0x02802, /* S */ 0x02802,
+ /* T */ 0x02802, /* U */ 0x02802, /* V */ 0x02802, /* W */ 0x02802,
+ /* X */ 0x02802, /* Y */ 0x02802, /* Z */ 0x02802, /* [ */ 0x0A200,
+ /* \ */ 0x0A000, /* ] */ 0x0A200, /* ^ */ 0x0A840, /* _ */ 0x12820,
+ /* ` */ 0x0A000, /* a */ 0x02811, /* b */ 0x02811, /* c */ 0x02811,
+ /* d */ 0x02811, /* e */ 0x02811, /* f */ 0x42811, /* g */ 0x02801,
+ /* h */ 0x02801, /* i */ 0x02801, /* j */ 0x02801, /* k */ 0x02801,
+ /* l */ 0x02801, /* m */ 0x02801, /* n */ 0x42801, /* o */ 0x02801,
+ /* p */ 0x02801, /* q */ 0x02801, /* r */ 0x02801, /* s */ 0x02801,
+ /* t */ 0x02801, /* u */ 0x02801, /* v */ 0x02801, /* w */ 0x02801,
+ /* x */ 0x02801, /* y */ 0x02801, /* z */ 0x02801, /* { */ 0x0A000,
+ /* | */ 0x0A800, /* } */ 0x0A000, /* ~ */ 0x0A800, /*x7F*/ 0x00000
+};
+#endif /* AUTOOPTS_INTERNAL */
+#endif /* AG_CHAR_MAP_H_GUARD */
/*
- * $Id: autoopts.c,v 4.25 2007/04/15 19:01:18 bkorb Exp $
- * Time-stamp: "2007-04-15 11:10:40 bkorb"
+ * $Id: autoopts.c,v 4.39 2009/01/25 19:31:59 bkorb Exp $
+ * Time-stamp: "2009-01-12 02:49:49 bkorb"
*
* This file contains all of the routines that must be linked into
* an executable to use the generated option processing. The optional
* routines are in separately compiled modules so that they will not
* necessarily be linked in.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
+ * These files have the following md5sums:
*
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
static char const zNil[] = "";
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static tSuccess
findOptDesc( tOptions* pOpts, tOptState* pOptState );
static tSuccess
-nextOption( tOptions* pOpts, tOptState* pOptState );
+next_opt_arg_must(tOptions* pOpts, tOptState* pOptState);
+
+static tSuccess
+next_opt_arg_may(tOptions* pOpts, tOptState* pOptState);
+
+static tSuccess
+next_opt_arg_none(tOptions* pOpts, tOptState* pOptState);
+
+static tSuccess
+nextOption(tOptions* pOpts, tOptState* pOptState);
static tSuccess
doPresets( tOptions* pOpts );
{
char * res = strdup(str);
if (res == NULL) {
- fprintf( stderr, "strdup of %d byte string failed\n", (int)strlen(str) );
+ fprintf(stderr, "strdup of %d byte string failed\n", (int)strlen(str));
exit( EXIT_FAILURE );
}
return res;
int matchCt = 0;
int matchIdx = 0;
int nameLen;
+ char opt_name_buf[128];
/*
* IF the value is attached to the name,
- * THEN clip it off.
- * Either way, figure out how long our name is
+ * copy it off so we can NUL terminate.
*/
if (pzEq != NULL) {
nameLen = (int)(pzEq - pzOptName);
- *pzEq = NUL;
+ if (nameLen >= sizeof(opt_name_buf))
+ return FAILURE;
+ memcpy(opt_name_buf, pzOptName, nameLen);
+ opt_name_buf[nameLen] = NUL;
+ pzOptName = opt_name_buf;
+ pzEq++;
+
} else nameLen = strlen( pzOptName );
do {
} while (pOD++, (++idx < idxLim));
- if (pzEq != NULL)
- *(pzEq++) = '=';
-
/*
* Make sure we either found an exact match or found only one partial
*/
* THEN call the usage procedure.
*/
if ((pOpts->fOptSet & OPTPROC_ERRSTOP) != 0) {
- fprintf( stderr, zIllOptStr, pOpts->pzProgPath,
- (matchCt == 0) ? zIllegal : zAmbiguous, pzOptName );
+ fprintf(stderr, (matchCt == 0) ? zIllOptStr : zAmbigOptStr,
+ pOpts->pzProgPath, pzOptName);
(*pOpts->pUsageProc)( pOpts, EXIT_FAILURE );
}
* THEN the result is the "option" itself and the
* option is the specially marked "number" option.
*/
- if ( isdigit( optValue )
+ if ( IS_DEC_DIGIT_CHAR(optValue)
&& (pOpts->specOptIdx.number_option != NO_EQUIVALENT) ) {
pOptState->pOD = \
pRes = pOpts->pOptDesc + pOpts->specOptIdx.number_option;
* IF all arguments must be named options, ...
*/
if (NAMED_OPTS(pOpts)) {
- char* pz = pOpts->pzCurOpt;
+ char * pz = pOpts->pzCurOpt;
+ int def;
+ tSuccess res;
+ tAoUS * def_opt;
+
pOpts->curOptIdx++;
+ if (*pz != '-')
+ return longOptionFind(pOpts, pz, pOptState);
+
/*
- * Skip over any flag/option markers.
- * In this mode, they are not required.
+ * The name is prefixed with one or more hyphens. Strip them off
+ * and disable the "default_opt" setting. Use heavy recasting to
+ * strip off the "const" quality of the "default_opt" field.
*/
- while (*pz == '-') pz++;
-
- return longOptionFind( pOpts, pz, pOptState );
+ while (*(++pz) == '-') ;
+ def_opt = (void *)&(pOpts->specOptIdx.default_opt);
+ def = *def_opt;
+ *def_opt = NO_EQUIVALENT;
+ res = longOptionFind(pOpts, pz, pOptState);
+ *def_opt = def;
+ return res;
}
/*
}
-/*
- * nextOption
- *
- * Find the option descriptor and option argument (if any) for the
- * next command line argument. DO NOT modify the descriptor. Put
- * all the state in the state argument so that the option can be skipped
- * without consequence (side effect).
- */
static tSuccess
-nextOption( tOptions* pOpts, tOptState* pOptState )
+next_opt_arg_must(tOptions* pOpts, tOptState* pOptState)
{
- tSuccess res;
- enum { ARG_NONE, ARG_MAY, ARG_MUST } arg_type = ARG_NONE;
- teOptArgType at;
-
- res = findOptDesc( pOpts, pOptState );
- if (! SUCCESSFUL( res ))
- return res;
- pOptState->flags |= (pOptState->pOD->fOptState & OPTST_PERSISTENT_MASK);
- at = OPTST_GET_ARGTYPE(pOptState->flags);
-
/*
- * Figure out what to do about option arguments. An argument may be
- * required, not associated with the option, or be optional. We detect the
- * latter by examining for an option marker on the next possible argument.
- * Disabled mode option selection also disables option arguments.
+ * An option argument is required. Long options can either have
+ * a separate command line argument, or an argument attached by
+ * the '=' character. Figure out which.
*/
- if ((pOptState->flags & OPTST_DISABLED) != 0)
- arg_type = ARG_NONE;
- else if (at == OPARG_TYPE_NONE)
- arg_type = ARG_NONE;
- else if (pOptState->flags & OPTST_ARG_OPTIONAL)
- arg_type = ARG_MAY;
- else
- arg_type = ARG_MUST;
-
- switch (arg_type) {
- case ARG_MUST:
+ switch (pOptState->optType) {
+ case TOPT_SHORT:
/*
- * An option argument is required. Long options can either have
- * a separate command line argument, or an argument attached by
- * the '=' character. Figure out which.
+ * See if an arg string follows the flag character
*/
- switch (pOptState->optType) {
- case TOPT_SHORT:
- /*
- * See if an arg string follows the flag character
- */
- if (*++(pOpts->pzCurOpt) == NUL)
- pOpts->pzCurOpt = pOpts->origArgVect[ pOpts->curOptIdx++ ];
- pOptState->pzOptArg = pOpts->pzCurOpt;
- break;
+ if (*++(pOpts->pzCurOpt) == NUL)
+ pOpts->pzCurOpt = pOpts->origArgVect[ pOpts->curOptIdx++ ];
+ pOptState->pzOptArg = pOpts->pzCurOpt;
+ break;
- case TOPT_LONG:
- /*
- * See if an arg string has already been assigned (glued on
- * with an `=' character)
- */
- if (pOptState->pzOptArg == NULL)
- pOptState->pzOptArg = pOpts->origArgVect[ pOpts->curOptIdx++ ];
- break;
+ case TOPT_LONG:
+ /*
+ * See if an arg string has already been assigned (glued on
+ * with an `=' character)
+ */
+ if (pOptState->pzOptArg == NULL)
+ pOptState->pzOptArg = pOpts->origArgVect[ pOpts->curOptIdx++ ];
+ break;
- default:
+ default:
#ifdef DEBUG
- fputs( "AutoOpts lib error: option type not selected\n",
- stderr );
- exit( EXIT_FAILURE );
+ fputs( "AutoOpts lib error: option type not selected\n",
+ stderr );
+ exit( EXIT_FAILURE );
#endif
- case TOPT_DEFAULT:
- /*
- * The option was selected by default. The current token is
- * the option argument.
- */
- break;
- }
-
+ case TOPT_DEFAULT:
/*
- * Make sure we did not overflow the argument list.
+ * The option was selected by default. The current token is
+ * the option argument.
*/
- if (pOpts->curOptIdx > pOpts->origArgCt) {
- fprintf( stderr, zMisArg, pOpts->pzProgPath,
- pOptState->pOD->pz_Name );
- return FAILURE;
- }
-
- pOpts->pzCurOpt = NULL; /* next time advance to next arg */
break;
+ }
- case ARG_MAY:
- /*
- * An option argument is optional.
- */
- switch (pOptState->optType) {
- case TOPT_SHORT:
- if (*++pOpts->pzCurOpt != NUL)
- pOptState->pzOptArg = pOpts->pzCurOpt;
- else {
- char* pzLA = pOpts->origArgVect[ pOpts->curOptIdx ];
-
- /*
- * BECAUSE it is optional, we must make sure
- * we did not find another flag and that there
- * is such an argument.
- */
- if ((pzLA == NULL) || (*pzLA == '-'))
- pOptState->pzOptArg = NULL;
- else {
- pOpts->curOptIdx++; /* argument found */
- pOptState->pzOptArg = pzLA;
- }
- }
- break;
+ /*
+ * Make sure we did not overflow the argument list.
+ */
+ if (pOpts->curOptIdx > pOpts->origArgCt) {
+ fprintf( stderr, zMisArg, pOpts->pzProgPath,
+ pOptState->pOD->pz_Name );
+ return FAILURE;
+ }
+
+ pOpts->pzCurOpt = NULL; /* next time advance to next arg */
+ return SUCCESS;
+}
+
+
+static tSuccess
+next_opt_arg_may(tOptions* pOpts, tOptState* pOptState)
+{
+ /*
+ * An option argument is optional.
+ */
+ switch (pOptState->optType) {
+ case TOPT_SHORT:
+ if (*++pOpts->pzCurOpt != NUL)
+ pOptState->pzOptArg = pOpts->pzCurOpt;
+ else {
+ char* pzLA = pOpts->origArgVect[ pOpts->curOptIdx ];
- case TOPT_LONG:
/*
- * Look for an argument if we don't already have one (glued on
- * with a `=' character) *AND* we are not in named argument mode
+ * BECAUSE it is optional, we must make sure
+ * we did not find another flag and that there
+ * is such an argument.
*/
- if ( (pOptState->pzOptArg == NULL)
- && (! NAMED_OPTS(pOpts))) {
- char* pzLA = pOpts->origArgVect[ pOpts->curOptIdx ];
-
- /*
- * BECAUSE it is optional, we must make sure
- * we did not find another flag and that there
- * is such an argument.
- */
- if ((pzLA == NULL) || (*pzLA == '-'))
- pOptState->pzOptArg = NULL;
- else {
- pOpts->curOptIdx++; /* argument found */
- pOptState->pzOptArg = pzLA;
- }
+ if ((pzLA == NULL) || (*pzLA == '-'))
+ pOptState->pzOptArg = NULL;
+ else {
+ pOpts->curOptIdx++; /* argument found */
+ pOptState->pzOptArg = pzLA;
}
- break;
-
- default:
- case TOPT_DEFAULT:
- fputs( "AutoOpts lib error: defaulted to option with optional arg\n",
- stderr );
- exit( EX_SOFTWARE );
}
-
- /*
- * After an option with an optional argument, we will
- * *always* start with the next option because if there
- * were any characters following the option name/flag,
- * they would be interpreted as the argument.
- */
- pOpts->pzCurOpt = NULL;
break;
- default: /* CANNOT */
+ case TOPT_LONG:
/*
- * No option argument. Make sure next time around we find
- * the correct option flag character for short options
+ * Look for an argument if we don't already have one (glued on
+ * with a `=' character) *AND* we are not in named argument mode
*/
- if (pOptState->optType == TOPT_SHORT)
- (pOpts->pzCurOpt)++;
+ if ( (pOptState->pzOptArg == NULL)
+ && (! NAMED_OPTS(pOpts))) {
+ char* pzLA = pOpts->origArgVect[ pOpts->curOptIdx ];
- /*
- * It is a long option. Make sure there was no ``=xxx'' argument
- */
- else if (pOptState->pzOptArg != NULL) {
- fprintf( stderr, zNoArg, pOpts->pzProgPath,
- pOptState->pOD->pz_Name );
- return FAILURE;
+ /*
+ * BECAUSE it is optional, we must make sure
+ * we did not find another flag and that there
+ * is such an argument.
+ */
+ if ((pzLA == NULL) || (*pzLA == '-'))
+ pOptState->pzOptArg = NULL;
+ else {
+ pOpts->curOptIdx++; /* argument found */
+ pOptState->pzOptArg = pzLA;
+ }
}
+ break;
- /*
- * It is a long option. Advance to next command line argument.
- */
- else
- pOpts->pzCurOpt = NULL;
+ default:
+ case TOPT_DEFAULT:
+ fputs(zAO_Woops, stderr );
+ exit( EX_SOFTWARE );
}
+ /*
+ * After an option with an optional argument, we will
+ * *always* start with the next option because if there
+ * were any characters following the option name/flag,
+ * they would be interpreted as the argument.
+ */
+ pOpts->pzCurOpt = NULL;
return SUCCESS;
}
+static tSuccess
+next_opt_arg_none(tOptions* pOpts, tOptState* pOptState)
+{
+ /*
+ * No option argument. Make sure next time around we find
+ * the correct option flag character for short options
+ */
+ if (pOptState->optType == TOPT_SHORT)
+ (pOpts->pzCurOpt)++;
+
+ /*
+ * It is a long option. Make sure there was no ``=xxx'' argument
+ */
+ else if (pOptState->pzOptArg != NULL) {
+ fprintf(stderr, zNoArg, pOpts->pzProgPath, pOptState->pOD->pz_Name);
+ return FAILURE;
+ }
+
+ /*
+ * It is a long option. Advance to next command line argument.
+ */
+ else
+ pOpts->pzCurOpt = NULL;
+ return SUCCESS;
+}
+
+/*
+ * nextOption
+ *
+ * Find the option descriptor and option argument (if any) for the
+ * next command line argument. DO NOT modify the descriptor. Put
+ * all the state in the state argument so that the option can be skipped
+ * without consequence (side effect).
+ */
+static tSuccess
+nextOption(tOptions* pOpts, tOptState* pOptState)
+{
+ {
+ tSuccess res;
+ res = findOptDesc( pOpts, pOptState );
+ if (! SUCCESSFUL( res ))
+ return res;
+ }
+
+ if ( ((pOptState->flags & OPTST_DEFINED) != 0)
+ && ((pOptState->pOD->fOptState & OPTST_NO_COMMAND) != 0)) {
+ fprintf(stderr, zNotCmdOpt, pOptState->pOD->pz_Name);
+ return FAILURE;
+ }
+
+ pOptState->flags |= (pOptState->pOD->fOptState & OPTST_PERSISTENT_MASK);
+
+ /*
+ * Figure out what to do about option arguments. An argument may be
+ * required, not associated with the option, or be optional. We detect the
+ * latter by examining for an option marker on the next possible argument.
+ * Disabled mode option selection also disables option arguments.
+ */
+ {
+ enum { ARG_NONE, ARG_MAY, ARG_MUST } arg_type = ARG_NONE;
+ tSuccess res;
+
+ if ((pOptState->flags & OPTST_DISABLED) != 0)
+ arg_type = ARG_NONE;
+
+ else if (OPTST_GET_ARGTYPE(pOptState->flags) == OPARG_TYPE_NONE)
+ arg_type = ARG_NONE;
+
+ else if (pOptState->flags & OPTST_ARG_OPTIONAL)
+ arg_type = ARG_MAY;
+
+ else
+ arg_type = ARG_MUST;
+
+ switch (arg_type) {
+ case ARG_MUST: res = next_opt_arg_must(pOpts, pOptState); break;
+ case ARG_MAY: res = next_opt_arg_may( pOpts, pOptState); break;
+ case ARG_NONE: res = next_opt_arg_none(pOpts, pOptState); break;
+ }
+
+ return res;
+ }
+}
+
+
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* DO PRESETS
* has a --load-opts option. See if a command line option has disabled
* option presetting.
*/
- if (pOpts->specOptIdx.save_opts != 0) {
+ if ( (pOpts->specOptIdx.save_opts != NO_EQUIVALENT)
+ && (pOpts->specOptIdx.save_opts != 0)) {
pOD = pOpts->pOptDesc + pOpts->specOptIdx.save_opts + 1;
if (DISABLED_OPT(pOD))
return SUCCESS;
if (! SUCCESSFUL( doPresets( pOpts )))
return 0;
+ /*
+ * IF option name conversion was suppressed but it is not suppressed
+ * for the command line, then it's time to translate option names.
+ * Usage text will not get retranslated.
+ */
+ if ( ((pOpts->fOptSet & OPTPROC_TRANSLATE) != 0)
+ && (pOpts->pTransProc != NULL)
+ && ((pOpts->fOptSet & OPTPROC_NO_XLAT_MASK)
+ == OPTPROC_NXLAT_OPT_CFG) ) {
+
+ pOpts->fOptSet &= ~OPTPROC_NXLAT_OPT_CFG;
+ (*pOpts->pTransProc)();
+ }
+
if ((pOpts->fOptSet & OPTPROC_REORDER) != 0)
optionSort( pOpts );
* THEN do that now before testing for conflicts.
* (conflicts are ignored in preset options)
*/
- if (pOpts->specOptIdx.save_opts != 0) {
+ if ( (pOpts->specOptIdx.save_opts != NO_EQUIVALENT)
+ && (pOpts->specOptIdx.save_opts != 0)) {
tOptDesc* pOD = pOpts->pOptDesc + pOpts->specOptIdx.save_opts;
if (SELECTED_OPT( pOD )) {
/*
- * Time-stamp: "2007-04-15 09:59:39 bkorb"
+ * Time-stamp: "2008-11-01 20:08:06 bkorb"
*
- * autoopts.h $Id: autoopts.h,v 4.23 2007/04/15 19:01:18 bkorb Exp $
- * Time-stamp: "2005-02-14 05:59:50 bkorb"
+ * autoopts.h $Id: autoopts.h,v 4.30 2009/01/01 16:51:47 bkorb Exp $
*
* This file defines all the global structures and special values
* used in the automated option processing library.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
*
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * Automated Options 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.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * These files have the following md5sums:
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
- *
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
#ifndef AUTOGEN_AUTOOPTS_H
#define AUTOGEN_AUTOOPTS_H
#include "compat/compat.h"
+#include "ag-char-map.h"
#define AO_NAME_LIMIT 127
#define AO_NAME_SIZE ((size_t)(AO_NAME_LIMIT + 1))
#define PROCESSING(d) ((d)>0)
#define PRESETTING(d) ((d)<0)
-#define ISNAMECHAR( c ) (isalnum(c) || ((c) == '_') || ((c) == '-'))
-
/*
* Procedure success codes
*
tCC* pzStr;
tCC* pzReq;
tCC* pzNum;
+ tCC* pzFile;
tCC* pzKey;
tCC* pzKeyL;
tCC* pzBool;
tCC* pzNoF;
tCC* pzSpc;
tCC* pzOptFmt;
+ tCC* pzTime;
} arg_types_t;
#define AGALOC( c, w ) ao_malloc((size_t)c)
#define AGREALOC( p, c, w ) ao_realloc((void*)p, (size_t)c)
-#define AGFREE( p ) ao_free((void*)p)
+#define AGFREE(_p) do{void*X=(void*)_p;ao_free(X);}while(0)
#define AGDUPSTR( p, s, w ) (p = ao_strdup(s))
static void *
*
* DO NOT EDIT THIS FILE (options.h)
*
- * It has been AutoGen-ed Saturday May 5, 2007 at 12:02:34 PM PDT
+ * It has been AutoGen-ed Saturday May 16, 2009 at 08:15:53 AM PDT
* From the definitions funcs.def
* and the template file options_h
*
*
* Automated Options copyright 1992-Y Bruce Korb
*
- * AutoOpts is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
+ * AutoOpts is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
*
- * AutoOpts 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
- * Lesser General Public License for more details.
+ * AutoOpts 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 Lesser General Public License for more details.
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with AutoOpts. If not, write to:
- * The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301, USA.
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef AUTOOPTS_OPTIONS_H_GUARD
-#define AUTOOPTS_OPTIONS_H_GUARD
+#define AUTOOPTS_OPTIONS_H_GUARD 1
#include <sys/types.h>
+#include <stdio.h>
#if defined(HAVE_STDINT_H)
# include <stdint.h>
* values for "opt_name" are available.
*/
-#define OPTIONS_STRUCT_VERSION 118784
-#define OPTIONS_VERSION_STRING "29:0:4"
+#define OPTIONS_STRUCT_VERSION 131073
+#define OPTIONS_VERSION_STRING "32:1:7"
#define OPTIONS_MINIMUM_VERSION 102400
#define OPTIONS_MIN_VER_STRING "25:0:0"
OPARG_TYPE_BOOLEAN = 3, /* opt arg is boolean-valued */
OPARG_TYPE_MEMBERSHIP = 4, /* opt arg sets set membership bits */
OPARG_TYPE_NUMERIC = 5, /* opt arg has numeric value */
- OPARG_TYPE_HIERARCHY = 6 /* option arg is hierarchical value */
+ OPARG_TYPE_HIERARCHY = 6, /* option arg is hierarchical value */
+ OPARG_TYPE_FILE = 7, /* option arg names a file */
+ OPARG_TYPE_TIME = 8 /* opt arg is a time duration */
} teOptArgType;
typedef struct optionValue {
} v;
} tOptionValue;
+typedef enum {
+ FTYPE_MODE_MAY_EXIST = 0x00,
+ FTYPE_MODE_MUST_EXIST = 0x01,
+ FTYPE_MODE_MUST_NOT_EXIST = 0x02,
+ FTYPE_MODE_EXIST_MASK = 0x03,
+ FTYPE_MODE_NO_OPEN = 0x00,
+ FTYPE_MODE_OPEN_FD = 0x10,
+ FTYPE_MODE_FOPEN_FP = 0x20,
+ FTYPE_MODE_OPEN_MASK = 0x30
+} teOptFileType;
+
+typedef union {
+ int file_flags;
+ char const * file_mode;
+} tuFileMode;
+
/*
* Bits in the fOptState option descriptor field.
*/
OPTST_SET_ID = 0, /* Set via the "SET_OPT()" macro */
OPTST_PRESET_ID = 1, /* Set via an RC/INI file */
OPTST_DEFINED_ID = 2, /* Set via a command line option */
+ OPTST_RESET_ID = 3, /* Reset via command line option */
OPTST_EQUIVALENCE_ID = 4, /* selected by equiv'ed option */
OPTST_DISABLED_ID = 5, /* option is in disabled state */
OPTST_ALLOC_ARG_ID = 6, /* pzOptArg was allocated */
OPTST_MUST_SET_ID = 20, /* must be set or pre-set */
OPTST_DOCUMENT_ID = 21, /* opt is for doc only */
OPTST_TWICE_ID = 22, /* process opt twice - imm + reg */
- OPTST_DISABLE_TWICE_ID = 23 /* process disabled option twice */
+ OPTST_DISABLE_TWICE_ID = 23, /* process disabled option twice */
+ OPTST_SCALED_NUM_ID = 24, /* scaled integer value */
+ OPTST_NO_COMMAND_ID = 25, /* disable from cmd line */
+ OPTST_DEPRECATED_ID = 26 /* support is being removed */
} opt_state_enum_t;
#define OPTST_INIT 0U
#define OPTST_SET (1U << OPTST_SET_ID)
#define OPTST_PRESET (1U << OPTST_PRESET_ID)
#define OPTST_DEFINED (1U << OPTST_DEFINED_ID)
+#define OPTST_RESET (1U << OPTST_RESET_ID)
#define OPTST_EQUIVALENCE (1U << OPTST_EQUIVALENCE_ID)
#define OPTST_DISABLED (1U << OPTST_DISABLED_ID)
#define OPTST_ALLOC_ARG (1U << OPTST_ALLOC_ARG_ID)
#define OPTST_DOCUMENT (1U << OPTST_DOCUMENT_ID)
#define OPTST_TWICE (1U << OPTST_TWICE_ID)
#define OPTST_DISABLE_TWICE (1U << OPTST_DISABLE_TWICE_ID)
-#define OPT_STATE_MASK 0x00FFFF77U
+#define OPTST_SCALED_NUM (1U << OPTST_SCALED_NUM_ID)
+#define OPTST_NO_COMMAND (1U << OPTST_NO_COMMAND_ID)
+#define OPTST_DEPRECATED (1U << OPTST_DEPRECATED_ID)
+#define OPT_STATE_MASK 0x07FFFF7FU
#define OPTST_SET_MASK ( \
OPTST_SET | \
OPTST_PRESET | \
+ OPTST_RESET | \
OPTST_DEFINED )
#define OPTST_MUTABLE_MASK ( \
OPTST_SET | \
OPTST_PRESET | \
+ OPTST_RESET | \
OPTST_DEFINED | \
OPTST_EQUIVALENCE | \
OPTST_DISABLED | \
OPTST_ARG_TYPE_3 | \
OPTST_ARG_TYPE_4 )
+#define OPTST_DO_NOT_SAVE_MASK ( \
+ OPTST_NO_INIT | \
+ OPTST_DOCUMENT | \
+ OPTST_OMITTED )
+
+#define OPTST_NO_USAGE_MASK ( \
+ OPTST_OMITTED | \
+ OPTST_NO_COMMAND | \
+ OPTST_DEPRECATED )
+
#ifdef NO_OPTIONAL_OPT_ARGS
# undef OPTST_ARG_OPTIONAL
# define OPTST_ARG_OPTIONAL 0
#define OPTST_PERSISTENT_MASK (~OPTST_MUTABLE_MASK)
-#define SELECTED_OPT( pod ) ((pod)->fOptState & OPTST_SELECTED_MASK)
-#define UNUSED_OPT( pod ) (((pod)->fOptState & OPTST_SET_MASK) == 0)
-#define DISABLED_OPT( pod ) ((pod)->fOptState & OPTST_DISABLED)
-#define OPTION_STATE( pod ) ((pod)->fOptState)
-
-#define OPTST_SET_ARGTYPE(n) ((n) << OPTST_ARG_TYPE_1_ID)
-#define OPTST_GET_ARGTYPE(f) (((f) & OPTST_ARG_TYPE_MASK)>>OPTST_ARG_TYPE_1_ID)
+#define SELECTED_OPT(_od) ((_od)->fOptState & OPTST_SELECTED_MASK)
+#define UNUSED_OPT( _od) (((_od)->fOptState & OPTST_SET_MASK) == 0)
+#define DISABLED_OPT(_od) ((_od)->fOptState & OPTST_DISABLED)
+#define OPTION_STATE(_od) ((_od)->fOptState)
+#define OPTST_SET_ARGTYPE(_n) ((_n) << OPTST_ARG_TYPE_1_ID)
+#define OPTST_GET_ARGTYPE(_f) (((_f)&OPTST_ARG_TYPE_MASK)>>OPTST_ARG_TYPE_1_ID)
/*
* PRIVATE INTERFACES
* Define the processing state flags
*/
typedef enum {
- OPTPROC_LONGOPT_ID = 0, /* Process long style options */
- OPTPROC_SHORTOPT_ID = 1, /* Process short style "flags" */
- OPTPROC_ERRSTOP_ID = 2, /* Stop on argument errors */
- OPTPROC_DISABLEDOPT_ID = 3, /* Current option is disabled */
- OPTPROC_NO_REQ_OPT_ID = 4, /* no options are required */
- OPTPROC_NUM_OPT_ID = 5, /* there is a number option */
- OPTPROC_INITDONE_ID = 6, /* have initializations been done? */
- OPTPROC_NEGATIONS_ID = 7, /* any negation options? */
- OPTPROC_ENVIRON_ID = 8, /* check environment? */
- OPTPROC_NO_ARGS_ID = 9, /* Disallow remaining arguments */
- OPTPROC_ARGS_REQ_ID = 10, /* Require arguments after options */
- OPTPROC_REORDER_ID = 11, /* reorder operands after options */
- OPTPROC_GNUUSAGE_ID = 12, /* emit usage in GNU style */
- OPTPROC_TRANSLATE_ID = 13, /* Translate strings in tOptions */
- OPTPROC_HAS_IMMED_ID = 14, /* program defines immed options */
- OPTPROC_PRESETTING_ID = 19 /* opt processing in preset state */
+ OPTPROC_LONGOPT_ID = 0, /* Process long style options */
+ OPTPROC_SHORTOPT_ID = 1, /* Process short style "flags" */
+ OPTPROC_ERRSTOP_ID = 2, /* Stop on argument errors */
+ OPTPROC_DISABLEDOPT_ID = 3, /* Current option is disabled */
+ OPTPROC_NO_REQ_OPT_ID = 4, /* no options are required */
+ OPTPROC_NUM_OPT_ID = 5, /* there is a number option */
+ OPTPROC_INITDONE_ID = 6, /* have inits been done? */
+ OPTPROC_NEGATIONS_ID = 7, /* any negation options? */
+ OPTPROC_ENVIRON_ID = 8, /* check environment? */
+ OPTPROC_NO_ARGS_ID = 9, /* Disallow remaining arguments */
+ OPTPROC_ARGS_REQ_ID = 10, /* Require args after options */
+ OPTPROC_REORDER_ID = 11, /* reorder operands after opts */
+ OPTPROC_GNUUSAGE_ID = 12, /* emit usage in GNU style */
+ OPTPROC_TRANSLATE_ID = 13, /* Translate strings in tOptions */
+ OPTPROC_NXLAT_OPT_CFG_ID = 16, /* suppress for config only */
+ OPTPROC_NXLAT_OPT_ID = 17, /* suppress xlation always */
+ OPTPROC_PRESETTING_ID = 19 /* opt processing in preset state */
} optproc_state_enum_t;
-#define OPTPROC_NONE 0U
-#define OPTPROC_LONGOPT (1U << OPTPROC_LONGOPT_ID)
-#define OPTPROC_SHORTOPT (1U << OPTPROC_SHORTOPT_ID)
-#define OPTPROC_ERRSTOP (1U << OPTPROC_ERRSTOP_ID)
-#define OPTPROC_DISABLEDOPT (1U << OPTPROC_DISABLEDOPT_ID)
-#define OPTPROC_NO_REQ_OPT (1U << OPTPROC_NO_REQ_OPT_ID)
-#define OPTPROC_NUM_OPT (1U << OPTPROC_NUM_OPT_ID)
-#define OPTPROC_INITDONE (1U << OPTPROC_INITDONE_ID)
-#define OPTPROC_NEGATIONS (1U << OPTPROC_NEGATIONS_ID)
-#define OPTPROC_ENVIRON (1U << OPTPROC_ENVIRON_ID)
-#define OPTPROC_NO_ARGS (1U << OPTPROC_NO_ARGS_ID)
-#define OPTPROC_ARGS_REQ (1U << OPTPROC_ARGS_REQ_ID)
-#define OPTPROC_REORDER (1U << OPTPROC_REORDER_ID)
-#define OPTPROC_GNUUSAGE (1U << OPTPROC_GNUUSAGE_ID)
-#define OPTPROC_TRANSLATE (1U << OPTPROC_TRANSLATE_ID)
-#define OPTPROC_HAS_IMMED (1U << OPTPROC_HAS_IMMED_ID)
-#define OPTPROC_PRESETTING (1U << OPTPROC_PRESETTING_ID)
-#define OPTPROC_STATE_MASK 0x00087FFFU
+#define OPTPROC_NONE 0U
+#define OPTPROC_LONGOPT (1U << OPTPROC_LONGOPT_ID)
+#define OPTPROC_SHORTOPT (1U << OPTPROC_SHORTOPT_ID)
+#define OPTPROC_ERRSTOP (1U << OPTPROC_ERRSTOP_ID)
+#define OPTPROC_DISABLEDOPT (1U << OPTPROC_DISABLEDOPT_ID)
+#define OPTPROC_NO_REQ_OPT (1U << OPTPROC_NO_REQ_OPT_ID)
+#define OPTPROC_NUM_OPT (1U << OPTPROC_NUM_OPT_ID)
+#define OPTPROC_INITDONE (1U << OPTPROC_INITDONE_ID)
+#define OPTPROC_NEGATIONS (1U << OPTPROC_NEGATIONS_ID)
+#define OPTPROC_ENVIRON (1U << OPTPROC_ENVIRON_ID)
+#define OPTPROC_NO_ARGS (1U << OPTPROC_NO_ARGS_ID)
+#define OPTPROC_ARGS_REQ (1U << OPTPROC_ARGS_REQ_ID)
+#define OPTPROC_REORDER (1U << OPTPROC_REORDER_ID)
+#define OPTPROC_GNUUSAGE (1U << OPTPROC_GNUUSAGE_ID)
+#define OPTPROC_TRANSLATE (1U << OPTPROC_TRANSLATE_ID)
+#define OPTPROC_NXLAT_OPT_CFG (1U << OPTPROC_NXLAT_OPT_CFG_ID)
+#define OPTPROC_NXLAT_OPT (1U << OPTPROC_NXLAT_OPT_ID)
+#define OPTPROC_PRESETTING (1U << OPTPROC_PRESETTING_ID)
+#define OPTPROC_STATE_MASK 0x000B3FFFU
+
+#define OPTPROC_NO_XLAT_MASK ( \
+ OPTPROC_NXLAT_OPT_CFG | \
+ OPTPROC_NXLAT_OPT )
#define STMTS(s) do { s; } while (0)
typedef struct options tOptions;
typedef struct optDesc tOptDesc;
typedef struct optNames tOptNames;
+#define OPTPROC_EMIT_USAGE ((tOptions *)0x01UL)
+#define OPTPROC_EMIT_SHELL ((tOptions *)0x02UL)
+#define OPTPROC_RETURN_VALNAME ((tOptions *)0x03UL)
+#define OPTPROC_EMIT_LIMIT ((tOptions *)0x0FUL)
/*
* The option procedures do the special processing for each
* option flag that needs it.
*/
-typedef void (tOptProc)( tOptions* pOpts, tOptDesc* pOptDesc );
+typedef void (tOptProc)(tOptions* pOpts, tOptDesc* pOptDesc);
typedef tOptProc* tpOptProc;
/*
* The usage procedure will never return. It calls "exit(2)"
* with the "exitCode" argument passed to it.
*/
-typedef void (tUsageProc)( tOptions* pOpts, int exitCode );
+typedef void (tUsageProc)(tOptions* pOpts, int exitCode);
typedef tUsageProc* tpUsageProc;
/*
long argInt;
unsigned long argUint;
unsigned int argBool;
+ FILE* argFp;
+ int argFd;
} optArgBucket_t;
/*
# define pzLastArg optArg.argString
void* optCookie; /* PUBLIC */
- const int * pOptMust;
- const int * pOptCant;
- tpOptProc pOptProc;
- char const* pzText;
+ int const * const pOptMust;
+ int const * const pOptCant;
+ tpOptProc const pOptProc;
+ char const* const pzText;
- char const* pz_NAME;
- char const* pz_Name;
- char const* pz_DisableName;
- char const* pz_DisablePfx;
+ char const* const pz_NAME;
+ char const* const pz_Name;
+ char const* const pz_DisableName;
+ char const* const pz_DisablePfx;
};
/*
unsigned int curOptIdx;
char* pzCurOpt;
- char const* pzProgPath;
- char const* pzProgName;
- char const* const pzPROGNAME;
- char const* const pzRcName;
- char const* const pzCopyright;
- char const* const pzCopyNotice;
- char const* const pzFullVersion;
+ char const* pzProgPath; /* PUBLIC */
+ char const* pzProgName; /* PUBLIC */
+ char const* const pzPROGNAME; /* PUBLIC */
+ char const* const pzRcName; /* PUBLIC */
+ char const* const pzCopyright; /* PUBLIC */
+ char const* const pzCopyNotice; /* PUBLIC */
+ char const* const pzFullVersion; /* PUBLIC */
char const* const* const papzHomeList;
char const* const pzUsageTitle;
char const* const pzExplain;
char const* const pzDetail;
- tOptDesc* const pOptDesc;
- char const* const pzBugAddr;
+ tOptDesc* const pOptDesc; /* PUBLIC */
+ char const* const pzBugAddr; /* PUBLIC */
void* pExtensions;
void* pSavedState;
tOptSpecIndex specOptIdx;
int const optCt;
int const presetOptCt;
+ char const * pzFullUsage;
+ char const * pzShortUsage;
+ /* PUBLIC: */
+ optArgBucket_t const * const originalOptArgArray;
+ void * const * const originalOptArgCookie;
};
+/*
+ * Versions where in various fields first appear:
+ * ($AO_CURRENT * 4096 + $AO_REVISION, but $AO_REVISION must be zero)
+ */
+#define originalOptArgArray_STRUCT_VERSION 131072 /* AO_CURRENT = 32 */
+#define HAS_originalOptArgArray(_opt) \
+ ((_opt)->structVersion >= originalOptArgArray_STRUCT_VERSION)
+
/*
* "token list" structure returned by "string_tokenize()"
*/
* The following routines may be coded into AutoOpts client code:
*/
-/* From: tokenize.c line 115
+/* From: tokenize.c line 117
*
* ao_string_tokenize - tokenize an input string
*
* Double quote strings are formed according to the rules of string
* constants in ANSI-C programs.
*/
-extern token_list_t* ao_string_tokenize( char const* );
+extern token_list_t* ao_string_tokenize(char const*);
-/* From: configfile.c line 113
+/* From: configfile.c line 85
*
* configFileLoad - parse a configuration file
*
* @code{optionGetValue()}, @code{optionNextValue()} and
* @code{optionUnloadNested()}.
*/
-extern const tOptionValue* configFileLoad( char const* );
+extern const tOptionValue* configFileLoad(char const*);
-/* From: configfile.c line 883
+/* From: configfile.c line 897
*
* optionFileLoad - Load the locatable config files, in order
*
*
* Configuration files not found or not decipherable are simply ignored.
*/
-extern int optionFileLoad( tOptions*, char const* );
+extern int optionFileLoad(tOptions*, char const*);
-/* From: configfile.c line 245
+/* From: configfile.c line 217
*
* optionFindNextValue - find a hierarcicaly valued option instance
*
* configurable. It will search through the list and return the next entry
* that matches the criteria.
*/
-extern const tOptionValue* optionFindNextValue( const tOptDesc*, const tOptionValue*, char const*, char const* );
+extern const tOptionValue* optionFindNextValue(const tOptDesc*, const tOptionValue*, char const*, char const*);
-/* From: configfile.c line 171
+/* From: configfile.c line 143
*
* optionFindValue - find a hierarcicaly valued option instance
*
* This routine will find an entry in a nested value option or configurable.
* It will search through the list and return a matching entry.
*/
-extern const tOptionValue* optionFindValue( const tOptDesc*, char const*, char const* );
+extern const tOptionValue* optionFindValue(const tOptDesc*, char const*, char const*);
-/* From: restore.c line 188
+/* From: restore.c line 165
*
* optionFree - free allocated option processing memory
*
* AutoOpts sometimes allocates memory and puts pointers to it in the
* option state structures. This routine deallocates all such memory.
*/
-extern void optionFree( tOptions* );
+extern void optionFree(tOptions*);
-/* From: configfile.c line 314
+/* From: configfile.c line 286
*
* optionGetValue - get a specific value from a hierarcical list
*
* the first entry with a name that exactly matches the argument will be
* returned.
*/
-extern const tOptionValue* optionGetValue( const tOptionValue*, char const* );
+extern const tOptionValue* optionGetValue(const tOptionValue*, char const*);
-/* From: load.c line 521
+/* From: load.c line 498
*
* optionLoadLine - process a string for an option name and value
*
* formation used in AutoGen definition files (@pxref{basic expression}),
* except that you may not use backquotes.
*/
-extern void optionLoadLine( tOptions*, char const* );
+extern void optionLoadLine(tOptions*, char const*);
-/* From: configfile.c line 373
+/* From: configfile.c line 345
*
* optionNextValue - get the next value from a hierarchical list
*
* The "@var{pOldValue}" must have been gotten from a prior call to this
* routine or to "@code{opitonGetValue()}".
*/
-extern const tOptionValue* optionNextValue( const tOptionValue*, const tOptionValue* );
+extern const tOptionValue* optionNextValue(const tOptionValue*, const tOptionValue*);
-/* From: usage.c line 128
+/* From: usage.c line 107
*
* optionOnlyUsage - Print usage text for just the options
*
* This function may be used when the emitted usage must incorporate
* information not available to AutoOpts.
*/
-extern void optionOnlyUsage( tOptions*, int );
+extern void optionOnlyUsage(tOptions*, int);
-/* From: autoopts.c line 1012
+/* From: autoopts.c line 1041
*
* optionProcess - this is the main option processing routine
*
* is treated as an operand. Encountering an operand stops option
* processing.
*/
-extern int optionProcess( tOptions*, int, char** );
+extern int optionProcess(tOptions*, int, char**);
-/* From: restore.c line 145
+/* From: restore.c line 122
*
* optionRestore - restore option state from memory copy
*
* to optionProcess(3AO), then you may change the contents of the
* argc/argv parameters to optionProcess.
*/
-extern void optionRestore( tOptions* );
+extern void optionRestore(tOptions*);
-/* From: save.c line 334
+/* From: save.c line 670
*
* optionSaveFile - saves the option state to a file
*
* @code{homerc} attribute. If no @code{rcfile} attribute was specified, it
* will default to @code{.@i{programname}rc}. If you wish to specify another
* file, you should invoke the @code{SET_OPT_SAVE_OPTS( @i{filename} )} macro.
+ *
+ * The recommend usage is as follows:
+ * @example
+ * optionProcess(&progOptions, argc, argv);
+ * if (i_want_a_non_standard_place_for_this)
+ * SET_OPT_SAVE_OPTS("myfilename");
+ * optionSaveFile(&progOptions);
+ * @end example
*/
-extern void optionSaveFile( tOptions* );
+extern void optionSaveFile(tOptions*);
-/* From: restore.c line 93
+/* From: restore.c line 70
*
* optionSaveState - saves the option state to memory
*
* restoring of stacked string arguments and hierarchical values is
* disabled. The values are not saved.
*/
-extern void optionSaveState( tOptions* );
+extern void optionSaveState(tOptions*);
-/* From: nested.c line 559
+/* From: nested.c line 569
*
* optionUnloadNested - Deallocate the memory for a nested value
*
* have been gotten from a call to @code{configFileLoad()} (See
* @pxref{libopts-configFileLoad}).
*/
-extern void optionUnloadNested( tOptionValue const * );
+extern void optionUnloadNested(tOptionValue const *);
-/* From: version.c line 58
+/* From: version.c line 37
*
* optionVersion - return the compiled AutoOpts version number
*
* Returns the full version string compiled into the library.
* The returned string cannot be modified.
*/
-extern char const* optionVersion( void );
+extern char const* optionVersion(void);
-/* From: ../compat/pathfind.c line 34
+/* From: ../compat/pathfind.c line 33
*
* pathfind - fild a file in a list of directories
*
* @end example
*/
#ifndef HAVE_PATHFIND
-extern char* pathfind( char const*, char const*, char const* );
+extern char* pathfind(char const*, char const*, char const*);
#endif /* HAVE_PATHFIND */
-/* From: streqvcmp.c line 233
+/* From: streqvcmp.c line 208
*
* strequate - map a list of characters to the same value
*
* This function name is mapped to option_strequate so as to not conflict
* with the POSIX name space.
*/
-extern void strequate( char const* );
+extern void strequate(char const*);
-/* From: streqvcmp.c line 143
+/* From: streqvcmp.c line 118
*
* streqvcmp - compare two strings with an equivalence mapping
*
* This function name is mapped to option_streqvcmp so as to not conflict
* with the POSIX name space.
*/
-extern int streqvcmp( char const*, char const* );
+extern int streqvcmp(char const*, char const*);
-/* From: streqvcmp.c line 180
+/* From: streqvcmp.c line 155
*
* streqvmap - Set the character mappings for the streqv functions
*
* This function name is mapped to option_streqvmap so as to not conflict
* with the POSIX name space.
*/
-extern void streqvmap( char, char, int );
+extern void streqvmap(char, char, int);
-/* From: streqvcmp.c line 102
+/* From: streqvcmp.c line 77
*
* strneqvcmp - compare two strings with an equivalence mapping
*
* This function name is mapped to option_strneqvcmp so as to not conflict
* with the POSIX name space.
*/
-extern int strneqvcmp( char const*, char const*, int );
+extern int strneqvcmp(char const*, char const*, int);
-/* From: streqvcmp.c line 259
+/* From: streqvcmp.c line 234
*
* strtransform - convert a string into its mapped-to value
*
* character is put into the output.
* This function name is mapped to option_strtransform so as to not conflict
* with the POSIX name space.
+ *
+ * The source and destination may be the same.
*/
-extern void strtransform( char*, char const* );
+extern void strtransform(char*, char const*);
/* AutoOpts PRIVATE FUNCTIONS: */
tOptProc optionStackArg, optionUnstackArg, optionBooleanVal, optionNumericVal;
-extern char* ao_string_cook( char*, int* );
+extern char* ao_string_cook(char*, int*);
+
+extern unsigned int ao_string_cook_escape_char(char const*, char*, unsigned int);
+
+extern void export_options_to_guile(tOptions*);
+
+extern void genshelloptUsage(tOptions*, int);
+
+extern void optionBooleanVal(tOptions*, tOptDesc*);
-extern unsigned int ao_string_cook_escape_char( char const*, char*, unsigned int );
+extern uintptr_t optionEnumerationVal(tOptions*, tOptDesc*, char const * const *, unsigned int);
-extern void export_options_to_guile( tOptions* );
+extern void optionFileCheck(tOptions*, tOptDesc*, teOptFileType, tuFileMode);
-extern void genshelloptUsage( tOptions*, int );
+extern char const* optionKeywordName(tOptDesc*, unsigned int);
-extern void optionBooleanVal( tOptions*, tOptDesc* );
+extern void optionLoadOpt(tOptions*, tOptDesc*);
-extern uintptr_t optionEnumerationVal( tOptions*, tOptDesc*, char const * const *, unsigned int );
+extern ag_bool optionMakePath(char*, int, char const*, char const*);
-extern char const* optionKeywordName( tOptDesc*, unsigned int );
+extern void optionNestedVal(tOptions*, tOptDesc*);
-extern void optionLoadOpt( tOptions*, tOptDesc* );
+extern void optionNumericVal(tOptions*, tOptDesc*);
-extern ag_bool optionMakePath( char*, int, char const*, char const* );
+extern void optionPagedUsage(tOptions*, tOptDesc*);
-extern void optionNestedVal( tOptions*, tOptDesc* );
+extern void optionParseShell(tOptions*);
-extern void optionNumericVal( tOptions*, tOptDesc* );
+extern void optionPrintVersion(tOptions*, tOptDesc*);
-extern void optionPagedUsage( tOptions*, tOptDesc* );
+extern void optionPutShell(tOptions*);
-extern void optionParseShell( tOptions* );
+extern void optionResetOpt(tOptions*, tOptDesc*);
-extern void optionPrintVersion( tOptions*, tOptDesc* );
+extern void optionSetMembers(tOptions*, tOptDesc*, char const * const *, unsigned int);
-extern void optionPutShell( tOptions* );
+extern void optionShowRange(tOptions*, tOptDesc*, void *, int);
-extern void optionSetMembers( tOptions*, tOptDesc*, char const * const *, unsigned int );
+extern void optionStackArg(tOptions*, tOptDesc*);
-extern void optionStackArg( tOptions*, tOptDesc* );
+extern void optionTimeVal(tOptions*, tOptDesc*);
-extern void optionUnstackArg( tOptions*, tOptDesc* );
+extern void optionUnstackArg(tOptions*, tOptDesc*);
-extern void optionUsage( tOptions*, int );
+extern void optionUsage(tOptions*, int);
-extern void optionVersionStderr( tOptions*, tOptDesc* );
+extern void optionVersionStderr(tOptions*, tOptDesc*);
-extern void* text_mmap( char const*, int, int, tmap_info_t* );
+extern void* text_mmap(char const*, int, int, tmap_info_t*);
-extern int text_munmap( tmap_info_t* );
+extern int text_munmap(tmap_info_t*);
CPLUSPLUS_CLOSER
#endif /* AUTOOPTS_OPTIONS_H_GUARD */
*
* DO NOT EDIT THIS FILE (usage-txt.h)
*
- * It has been AutoGen-ed Saturday May 5, 2007 at 12:02:33 PM PDT
+ * It has been AutoGen-ed Saturday May 16, 2009 at 08:15:52 AM PDT
* From the definitions usage-txt.def
* and the template file usage-txt.tpl
*
* This file handles all the bookkeeping required for tracking all the little
- * tiny strings used by the AutoOpts library. There are 113
+ * tiny strings used by the AutoOpts library. There are 130
* of them. This is not versioned because it is entirely internal to the
* library and accessed by client code only in a very well-controlled way:
* they may substitute translated strings using a procedure that steps through
* all the string pointers.
*
- * AutoOpts is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
+ * AutoOpts is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
*
- * AutoOpts 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
- * Lesser General Public License for more details.
+ * AutoOpts 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 Lesser General Public License for more details.
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with AutoOpts. If not, write to:
- * The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301, USA.
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef AUTOOPTS_USAGE_TXT_H_GUARD
-#define AUTOOPTS_USAGE_TXT_H_GUARD
+#define AUTOOPTS_USAGE_TXT_H_GUARD 1
#undef cch_t
#define cch_t char const
int field_ct;
char* utpz_GnuBoolArg;
char* utpz_GnuKeyArg;
+ char* utpz_GnuFileArg;
char* utpz_GnuKeyLArg;
+ char* utpz_GnuTimeArg;
char* utpz_GnuNumArg;
char* utpz_GnuStrArg;
- cch_t* apz_str[ 108 ];
+ cch_t* apz_str[ 123 ];
} usage_text_t;
/*
#define zAO_Big (option_usage_text.apz_str[ 1])
#define zAO_Err (option_usage_text.apz_str[ 2])
#define zAO_Sml (option_usage_text.apz_str[ 3])
-#define zAll (option_usage_text.apz_str[ 4])
-#define zAlt (option_usage_text.apz_str[ 5])
-#define zAmbigKey (option_usage_text.apz_str[ 6])
-#define zAmbiguous (option_usage_text.apz_str[ 7])
-#define zArgsMust (option_usage_text.apz_str[ 8])
-#define zAtMost (option_usage_text.apz_str[ 9])
-#define zAuto (option_usage_text.apz_str[ 10])
-#define zBadPipe (option_usage_text.apz_str[ 11])
-#define zBadVerArg (option_usage_text.apz_str[ 12])
-#define zCantFmt (option_usage_text.apz_str[ 13])
-#define zCantSave (option_usage_text.apz_str[ 14])
-#define zDefaultOpt (option_usage_text.apz_str[ 15])
-#define zDis (option_usage_text.apz_str[ 16])
-#define zEnab (option_usage_text.apz_str[ 17])
-#define zEquiv (option_usage_text.apz_str[ 18])
-#define zErrOnly (option_usage_text.apz_str[ 19])
-#define zExamineFmt (option_usage_text.apz_str[ 20])
-#define zFiveSpaces (option_usage_text.apz_str[ 21])
-#define zFlagOkay (option_usage_text.apz_str[ 22])
-#define zFmtFmt (option_usage_text.apz_str[ 23])
-#define zForkFail (option_usage_text.apz_str[ 24])
-#define zFSErrOptLoad (option_usage_text.apz_str[ 25])
-#define zFSErrReadFile (option_usage_text.apz_str[ 26])
-#define zGenshell (option_usage_text.apz_str[ 27])
+#define zAO_Ver (option_usage_text.apz_str[ 4])
+#define zAO_Woops (option_usage_text.apz_str[ 5])
+#define zAll (option_usage_text.apz_str[ 6])
+#define zAlt (option_usage_text.apz_str[ 7])
+#define zAmbigKey (option_usage_text.apz_str[ 8])
+#define zAmbigOptStr (option_usage_text.apz_str[ 9])
+#define zArgsMust (option_usage_text.apz_str[ 10])
+#define zAtMost (option_usage_text.apz_str[ 11])
+#define zAuto (option_usage_text.apz_str[ 12])
+#define zBadPipe (option_usage_text.apz_str[ 13])
+#define zBadVerArg (option_usage_text.apz_str[ 14])
+#define zCantFmt (option_usage_text.apz_str[ 15])
+#define zCantSave (option_usage_text.apz_str[ 16])
+#define zDefaultOpt (option_usage_text.apz_str[ 17])
+#define zDis (option_usage_text.apz_str[ 18])
+#define zEnab (option_usage_text.apz_str[ 19])
+#define zEquiv (option_usage_text.apz_str[ 20])
+#define zErrOnly (option_usage_text.apz_str[ 21])
+#define zExamineFmt (option_usage_text.apz_str[ 22])
+#define zFiveSpaces (option_usage_text.apz_str[ 23])
+#define zFlagOkay (option_usage_text.apz_str[ 24])
+#define zFmtFmt (option_usage_text.apz_str[ 25])
+#define zForkFail (option_usage_text.apz_str[ 26])
+#define zFSErrOptLoad (option_usage_text.apz_str[ 27])
+#define zFSErrReadFile (option_usage_text.apz_str[ 28])
+#define zFSOptError (option_usage_text.apz_str[ 29])
+#define zFSOptErrMayExist (option_usage_text.apz_str[ 30])
+#define zFSOptErrMustExist (option_usage_text.apz_str[ 31])
+#define zFSOptErrNoExist (option_usage_text.apz_str[ 32])
+#define zFSOptErrOpen (option_usage_text.apz_str[ 33])
+#define zFSOptErrFopen (option_usage_text.apz_str[ 34])
+#define zFileCannotExist (option_usage_text.apz_str[ 35])
+#define zFileMustExist (option_usage_text.apz_str[ 36])
+#define zGenshell (option_usage_text.apz_str[ 37])
#define zGnuBoolArg (option_usage_text.utpz_GnuBoolArg)
-#define zGnuBreak (option_usage_text.apz_str[ 28])
+#define zGnuBreak (option_usage_text.apz_str[ 38])
#define zGnuKeyArg (option_usage_text.utpz_GnuKeyArg)
+#define zGnuFileArg (option_usage_text.utpz_GnuFileArg)
#define zGnuKeyLArg (option_usage_text.utpz_GnuKeyLArg)
-#define zGnuNestArg (option_usage_text.apz_str[ 29])
+#define zGnuTimeArg (option_usage_text.utpz_GnuTimeArg)
+#define zGnuNestArg (option_usage_text.apz_str[ 39])
#define zGnuNumArg (option_usage_text.utpz_GnuNumArg)
-#define zGnuOptArg (option_usage_text.apz_str[ 30])
-#define zGnuOptFmt (option_usage_text.apz_str[ 31])
+#define zGnuOptArg (option_usage_text.apz_str[ 40])
+#define zGnuOptFmt (option_usage_text.apz_str[ 41])
#define zGnuStrArg (option_usage_text.utpz_GnuStrArg)
-#define zIllOptChr (option_usage_text.apz_str[ 32])
-#define zIllOptStr (option_usage_text.apz_str[ 33])
-#define zIllegal (option_usage_text.apz_str[ 34])
-#define zInvalOptDesc (option_usage_text.apz_str[ 35])
-#define zKeyWords (option_usage_text.apz_str[ 36])
-#define zLoadCooked (option_usage_text.apz_str[ 37])
-#define zLoadKeep (option_usage_text.apz_str[ 38])
-#define zLoadType (option_usage_text.apz_str[ 39])
-#define zLoadUncooked (option_usage_text.apz_str[ 40])
-#define zLtypeInteger (option_usage_text.apz_str[ 41])
-#define zLtypeNest (option_usage_text.apz_str[ 42])
-#define zLtypeString (option_usage_text.apz_str[ 43])
-#define zLtypeBool (option_usage_text.apz_str[ 44])
-#define zLtypeKeyword (option_usage_text.apz_str[ 45])
-#define zLtypeSetMembership (option_usage_text.apz_str[ 46])
-#define zMembers (option_usage_text.apz_str[ 47])
-#define zMisArg (option_usage_text.apz_str[ 48])
-#define zMultiEquiv (option_usage_text.apz_str[ 49])
-#define zMust (option_usage_text.apz_str[ 50])
-#define zNeedOne (option_usage_text.apz_str[ 51])
-#define zNoArg (option_usage_text.apz_str[ 52])
-#define zNoArgs (option_usage_text.apz_str[ 53])
-#define zNoCreat (option_usage_text.apz_str[ 54])
-#define zNoFlags (option_usage_text.apz_str[ 55])
-#define zNoKey (option_usage_text.apz_str[ 56])
-#define zNoLim (option_usage_text.apz_str[ 57])
-#define zNoPreset (option_usage_text.apz_str[ 58])
-#define zNoRq_NoShrtTtl (option_usage_text.apz_str[ 59])
-#define zNoRq_ShrtTtl (option_usage_text.apz_str[ 60])
-#define zNoStat (option_usage_text.apz_str[ 61])
-#define zNoState (option_usage_text.apz_str[ 62])
-#define zNone (option_usage_text.apz_str[ 63])
-#define zNotDef (option_usage_text.apz_str[ 64])
-#define zNotEnough (option_usage_text.apz_str[ 65])
-#define zNotFile (option_usage_text.apz_str[ 66])
-#define zNotNumber (option_usage_text.apz_str[ 67])
-#define zNrmOptFmt (option_usage_text.apz_str[ 68])
-#define zNumberOpt (option_usage_text.apz_str[ 69])
-#define zOneSpace (option_usage_text.apz_str[ 70])
-#define zOnlyOne (option_usage_text.apz_str[ 71])
-#define zOptsOnly (option_usage_text.apz_str[ 72])
-#define zPathFmt (option_usage_text.apz_str[ 73])
-#define zPlsSendBugs (option_usage_text.apz_str[ 74])
-#define zPreset (option_usage_text.apz_str[ 75])
-#define zPresetFile (option_usage_text.apz_str[ 76])
-#define zPresetIntro (option_usage_text.apz_str[ 77])
-#define zProg (option_usage_text.apz_str[ 78])
-#define zProhib (option_usage_text.apz_str[ 79])
-#define zReorder (option_usage_text.apz_str[ 80])
-#define zReqFmt (option_usage_text.apz_str[ 81])
-#define zReqOptFmt (option_usage_text.apz_str[ 82])
-#define zReqThese (option_usage_text.apz_str[ 83])
-#define zReq_NoShrtTtl (option_usage_text.apz_str[ 84])
-#define zReq_ShrtTtl (option_usage_text.apz_str[ 85])
-#define zSepChars (option_usage_text.apz_str[ 86])
-#define zSetMembers (option_usage_text.apz_str[ 87])
-#define zSetMemberSettings (option_usage_text.apz_str[ 88])
-#define zShrtGnuOptFmt (option_usage_text.apz_str[ 89])
-#define zSixSpaces (option_usage_text.apz_str[ 90])
-#define zStdBoolArg (option_usage_text.apz_str[ 91])
-#define zStdBreak (option_usage_text.apz_str[ 92])
-#define zStdKeyArg (option_usage_text.apz_str[ 93])
-#define zStdKeyLArg (option_usage_text.apz_str[ 94])
-#define zStdNestArg (option_usage_text.apz_str[ 95])
-#define zStdNoArg (option_usage_text.apz_str[ 96])
-#define zStdNumArg (option_usage_text.apz_str[ 97])
-#define zStdOptArg (option_usage_text.apz_str[ 98])
-#define zStdReqArg (option_usage_text.apz_str[ 99])
-#define zStdStrArg (option_usage_text.apz_str[100])
-#define zTabHyp (option_usage_text.apz_str[101])
-#define zTabHypAnd (option_usage_text.apz_str[102])
-#define zTabout (option_usage_text.apz_str[103])
-#define zThreeSpaces (option_usage_text.apz_str[104])
-#define zTwoSpaces (option_usage_text.apz_str[105])
-#define zUpTo (option_usage_text.apz_str[106])
-#define zValidKeys (option_usage_text.apz_str[107])
+#define zIllOptChr (option_usage_text.apz_str[ 42])
+#define zIllOptStr (option_usage_text.apz_str[ 43])
+#define zIllegal (option_usage_text.apz_str[ 44])
+#define zIntRange (option_usage_text.apz_str[ 45])
+#define zInvalOptDesc (option_usage_text.apz_str[ 46])
+#define zLowerBits (option_usage_text.apz_str[ 47])
+#define zMembers (option_usage_text.apz_str[ 48])
+#define zMisArg (option_usage_text.apz_str[ 49])
+#define zMultiEquiv (option_usage_text.apz_str[ 50])
+#define zMust (option_usage_text.apz_str[ 51])
+#define zNeedOne (option_usage_text.apz_str[ 52])
+#define zNoArg (option_usage_text.apz_str[ 53])
+#define zNoArgs (option_usage_text.apz_str[ 54])
+#define zNoCreat (option_usage_text.apz_str[ 55])
+#define zNoFlags (option_usage_text.apz_str[ 56])
+#define zNoKey (option_usage_text.apz_str[ 57])
+#define zNoLim (option_usage_text.apz_str[ 58])
+#define zNoPreset (option_usage_text.apz_str[ 59])
+#define zNoResetArg (option_usage_text.apz_str[ 60])
+#define zNoRq_NoShrtTtl (option_usage_text.apz_str[ 61])
+#define zNoRq_ShrtTtl (option_usage_text.apz_str[ 62])
+#define zNoStat (option_usage_text.apz_str[ 63])
+#define zNoState (option_usage_text.apz_str[ 64])
+#define zNone (option_usage_text.apz_str[ 65])
+#define zNotDef (option_usage_text.apz_str[ 66])
+#define zNotCmdOpt (option_usage_text.apz_str[ 67])
+#define zNotEnough (option_usage_text.apz_str[ 68])
+#define zNotFile (option_usage_text.apz_str[ 69])
+#define zNotNumber (option_usage_text.apz_str[ 70])
+#define zNrmOptFmt (option_usage_text.apz_str[ 71])
+#define zNumberOpt (option_usage_text.apz_str[ 72])
+#define zOneSpace (option_usage_text.apz_str[ 73])
+#define zOnlyOne (option_usage_text.apz_str[ 74])
+#define zOptsOnly (option_usage_text.apz_str[ 75])
+#define zPathFmt (option_usage_text.apz_str[ 76])
+#define zPlsSendBugs (option_usage_text.apz_str[ 77])
+#define zPreset (option_usage_text.apz_str[ 78])
+#define zPresetFile (option_usage_text.apz_str[ 79])
+#define zPresetIntro (option_usage_text.apz_str[ 80])
+#define zProg (option_usage_text.apz_str[ 81])
+#define zProhib (option_usage_text.apz_str[ 82])
+#define zReorder (option_usage_text.apz_str[ 83])
+#define zRange (option_usage_text.apz_str[ 84])
+#define zRangeAbove (option_usage_text.apz_str[ 85])
+#define zRangeLie (option_usage_text.apz_str[ 86])
+#define zRangeBadLie (option_usage_text.apz_str[ 87])
+#define zRangeOnly (option_usage_text.apz_str[ 88])
+#define zRangeOr (option_usage_text.apz_str[ 89])
+#define zRangeErr (option_usage_text.apz_str[ 90])
+#define zRangeExact (option_usage_text.apz_str[ 91])
+#define zRangeScaled (option_usage_text.apz_str[ 92])
+#define zRangeUpto (option_usage_text.apz_str[ 93])
+#define zResetNotConfig (option_usage_text.apz_str[ 94])
+#define zReqFmt (option_usage_text.apz_str[ 95])
+#define zReqOptFmt (option_usage_text.apz_str[ 96])
+#define zReqThese (option_usage_text.apz_str[ 97])
+#define zReq_NoShrtTtl (option_usage_text.apz_str[ 98])
+#define zReq_ShrtTtl (option_usage_text.apz_str[ 99])
+#define zSepChars (option_usage_text.apz_str[100])
+#define zSetMemberSettings (option_usage_text.apz_str[101])
+#define zShrtGnuOptFmt (option_usage_text.apz_str[102])
+#define zSixSpaces (option_usage_text.apz_str[103])
+#define zStdBoolArg (option_usage_text.apz_str[104])
+#define zStdBreak (option_usage_text.apz_str[105])
+#define zStdFileArg (option_usage_text.apz_str[106])
+#define zStdKeyArg (option_usage_text.apz_str[107])
+#define zStdKeyLArg (option_usage_text.apz_str[108])
+#define zStdTimeArg (option_usage_text.apz_str[109])
+#define zStdNestArg (option_usage_text.apz_str[110])
+#define zStdNoArg (option_usage_text.apz_str[111])
+#define zStdNumArg (option_usage_text.apz_str[112])
+#define zStdOptArg (option_usage_text.apz_str[113])
+#define zStdReqArg (option_usage_text.apz_str[114])
+#define zStdStrArg (option_usage_text.apz_str[115])
+#define zTabHyp (option_usage_text.apz_str[116])
+#define zTabHypAnd (option_usage_text.apz_str[117])
+#define zTabout (option_usage_text.apz_str[118])
+#define zThreeSpaces (option_usage_text.apz_str[119])
+#define zTwoSpaces (option_usage_text.apz_str[120])
+#define zUpTo (option_usage_text.apz_str[121])
+#define zValidKeys (option_usage_text.apz_str[122])
/*
* First, set up the strings. Some of these are writable. These are all in
static char eng_zGnuBoolArg[] = "=T/F";
static char eng_zGnuKeyArg[] = "=KWd";
+ static char eng_zGnuFileArg[] = "=file";
static char eng_zGnuKeyLArg[] = "=Mbr";
+ static char eng_zGnuTimeArg[] = "=Tim";
static char eng_zGnuNumArg[] = "=num";
static char eng_zGnuStrArg[] = "=str";
-static char const usage_txt[3208] =
+static char const usage_txt[4024] =
"AutoOpts function called without option descriptor\n\0"
"\tThis exceeds the compiled library version: \0"
"Automated Options Processing Error!\n"
"\t%s called AutoOpts function with structure version %d:%d:%d.\n\0"
"\tThis is less than the minimum library version: \0"
+ "Automated Options version %s\n"
+ "\tcopyright (c) 1999-2009 by Bruce Korb - all rights reserved\n\0"
+ "AutoOpts lib error: defaulted to option with optional arg\n\0"
"all\0"
"\t\t\t\t- an alternate for %s\n\0"
"%s error: the keyword `%s' is ambiguous for %s\n\0"
- "ambiguous\0"
+ "%s: ambiguous option -- %s\n\0"
"%s: Command line arguments required\n\0"
"%d %s%s options allowed\n\0"
"version and help options:\0"
"fs error %d (%s) on fork - cannot obtain %s usage\n\0"
"File error %d (%s) opening %s for loading options\n\0"
"fs error %d (%s) reading file %s\n\0"
+ "fs error %d (%s) on %s %s for option %s\n\0"
+ "stat-ing for directory\0"
+ "stat-ing for regular file\0"
+ "stat-ing for non-existant file\0"
+ "open-ing file\0"
+ "fopen-ing file\0"
+ "\t\t\t\t- file must not pre-exist\n\0"
+ "\t\t\t\t- file must pre-exist\n\0"
"\n"
"= = = = = = = =\n\n"
"This incarnation of genshell will produce\n"
"[=arg]\0"
"--%2$s%1$s\0"
"%s: illegal option -- %c\n\0"
- "%s: %s option -- %s\n\0"
+ "%s: illegal option -- %s\n\0"
"illegal\0"
+ " or an integer from %d through %d\n\0"
"AutoOpts ERROR: invalid option descriptor for %s\n\0"
- "words=\0"
- "cooked\0"
- "keep\0"
- "type=\0"
- "uncooked\0"
- "integer\0"
- "nested\0"
- "string\0"
- "bool\0"
- "keyword\0"
- "set\0"
+ " or an integer mask with any of the lower %d bits set\n\0"
"\t\t\t\t- is a set membership option\n\0"
"%s: option `%s' requires an argument\n\0"
"Equivalenced option '%s' was equivalenced to both\n"
"%s error: `%s' does not match any %s keywords\n\0"
"\t\t\t\t- may appear multiple times\n\0"
"\t\t\t\t- may not be preset\n\0"
+ "The 'reset-option' option requires an argument\n\0"
" Arg Option-Name Description\n\0"
" Flg Arg Option-Name Description\n\0"
"error %d (%s) stat-ing %s\n\0"
"%s(optionRestore): error: no saved option state\n\0"
"none\0"
"'%s' not defined\n\0"
+ "'%s' is not a command line option\n\0"
"ERROR: The %s option must appear %d times\n\0"
"error: cannot load options from non-regular file %s\n\0"
"%s error: `%s' is not a recognizable number\n\0"
"program\0"
"prohibits these options:\n\0"
"Operands and options may be intermixed. They will be reordered.\n\0"
+ "%s%ld to %ld\0"
+ "%sgreater than or equal to %ld\0"
+ "%sIt must lie in one of the ranges:\n\0"
+ "%sThis option must lie in one of the ranges:\n\0"
+ "%sit must be: \0"
+ ", or\n\0"
+ "%s error: %s option value ``%s'' is out of range.\n\0"
+ "%s%ld exactly\0"
+ "%sis scalable with a suffix: k/K/m/M/g/G/t/T\n\0"
+ "%sless than or equal to %ld\0"
+ "The --reset-option has not been configured.\n\0"
"ERROR: %s option requires the %s option\n\0"
" %3s %-14s %s\0"
"requires these options:\n\0"
" Arg Option-Name Req? Description\n\0"
" Flg Arg Option-Name Req? Description\n\0"
"-_^\0"
- "members=\0"
"or you may use a numeric representation. Preceding these with a '!' will\n"
"clear the bits, specifying 'none' will clear all bits, and 'all' will set them\n"
"all. Multiple entries may be passed as an option argument list.\n\0"
"\n"
"%s\n\n"
"%s\0"
+ "Fil\0"
"KWd\0"
"Mbr\0"
+ "Tim\0"
"Cpx\0"
"no \0"
"Num\0"
* Aren't you glad you don't maintain this by hand?
*/
usage_text_t option_usage_text = {
- 113,
- eng_zGnuBoolArg, eng_zGnuKeyArg, eng_zGnuKeyLArg, eng_zGnuNumArg,
- eng_zGnuStrArg,
+ 130,
+ eng_zGnuBoolArg, eng_zGnuKeyArg, eng_zGnuFileArg, eng_zGnuKeyLArg,
+ eng_zGnuTimeArg, eng_zGnuNumArg, eng_zGnuStrArg,
{
usage_txt + 0, usage_txt + 52, usage_txt + 98, usage_txt + 197,
- usage_txt + 247, usage_txt + 251, usage_txt + 278, usage_txt + 327,
- usage_txt + 337, usage_txt + 374, usage_txt + 399, usage_txt + 425,
- usage_txt + 465, usage_txt + 602, usage_txt + 650, usage_txt + 704,
- usage_txt + 746, usage_txt + 770, usage_txt + 796, usage_txt + 809,
- usage_txt + 823, usage_txt + 870, usage_txt + 876, usage_txt + 979,
- usage_txt + 991, usage_txt +1042, usage_txt +1093, usage_txt +1127,
- usage_txt +1233, usage_txt +1239, usage_txt +1245, usage_txt +1252,
- usage_txt +1263, usage_txt +1289, usage_txt +1310, usage_txt +1318,
- usage_txt +1369, usage_txt +1376, usage_txt +1383, usage_txt +1388,
- usage_txt +1394, usage_txt +1403, usage_txt +1411, usage_txt +1418,
- usage_txt +1425, usage_txt +1430, usage_txt +1438, usage_txt +1442,
- usage_txt +1476, usage_txt +1514, usage_txt +1579, usage_txt +1622,
- usage_txt +1657, usage_txt +1698, usage_txt +1738, usage_txt +1765,
- usage_txt +1832, usage_txt +1880, usage_txt +1913, usage_txt +1938,
- usage_txt +1973, usage_txt +2011, usage_txt +2038, usage_txt +2087,
- usage_txt +2092, usage_txt +2110, usage_txt +2154, usage_txt +2208,
- usage_txt +2254, usage_txt +2262, usage_txt +2310, usage_txt +2312,
- usage_txt +2337, usage_txt +2371, usage_txt +2390, usage_txt +2424,
- usage_txt +2460, usage_txt +2498, usage_txt +2554, usage_txt +2562,
- usage_txt +2588, usage_txt +2654, usage_txt +2696, usage_txt +2710,
- usage_txt +2735, usage_txt +2775, usage_txt +2818, usage_txt +2822,
- usage_txt +2831, usage_txt +3050, usage_txt +3053, usage_txt +3060,
- usage_txt +3064, usage_txt +3072, usage_txt +3076, usage_txt +3080,
- usage_txt +3084, usage_txt +3088, usage_txt +3092, usage_txt +3096,
- usage_txt +3100, usage_txt +3104, usage_txt +3111, usage_txt +3123,
- usage_txt +3131, usage_txt +3135, usage_txt +3138, usage_txt +3171
+ usage_txt + 247, usage_txt + 338, usage_txt + 397, usage_txt + 401,
+ usage_txt + 428, usage_txt + 477, usage_txt + 505, usage_txt + 542,
+ usage_txt + 567, usage_txt + 593, usage_txt + 633, usage_txt + 770,
+ usage_txt + 818, usage_txt + 872, usage_txt + 914, usage_txt + 938,
+ usage_txt + 964, usage_txt + 977, usage_txt + 991, usage_txt +1038,
+ usage_txt +1044, usage_txt +1147, usage_txt +1159, usage_txt +1210,
+ usage_txt +1261, usage_txt +1295, usage_txt +1336, usage_txt +1359,
+ usage_txt +1385, usage_txt +1416, usage_txt +1430, usage_txt +1445,
+ usage_txt +1476, usage_txt +1503, usage_txt +1609, usage_txt +1615,
+ usage_txt +1621, usage_txt +1628, usage_txt +1639, usage_txt +1665,
+ usage_txt +1691, usage_txt +1699, usage_txt +1735, usage_txt +1786,
+ usage_txt +1842, usage_txt +1876, usage_txt +1914, usage_txt +1979,
+ usage_txt +2022, usage_txt +2057, usage_txt +2098, usage_txt +2138,
+ usage_txt +2165, usage_txt +2232, usage_txt +2280, usage_txt +2313,
+ usage_txt +2338, usage_txt +2386, usage_txt +2421, usage_txt +2459,
+ usage_txt +2486, usage_txt +2535, usage_txt +2540, usage_txt +2558,
+ usage_txt +2593, usage_txt +2637, usage_txt +2691, usage_txt +2737,
+ usage_txt +2745, usage_txt +2793, usage_txt +2795, usage_txt +2820,
+ usage_txt +2854, usage_txt +2873, usage_txt +2907, usage_txt +2943,
+ usage_txt +2981, usage_txt +3037, usage_txt +3045, usage_txt +3071,
+ usage_txt +3137, usage_txt +3150, usage_txt +3181, usage_txt +3218,
+ usage_txt +3264, usage_txt +3280, usage_txt +3286, usage_txt +3338,
+ usage_txt +3352, usage_txt +3398, usage_txt +3426, usage_txt +3471,
+ usage_txt +3513, usage_txt +3527, usage_txt +3552, usage_txt +3592,
+ usage_txt +3635, usage_txt +3639, usage_txt +3858, usage_txt +3861,
+ usage_txt +3868, usage_txt +3872, usage_txt +3880, usage_txt +3884,
+ usage_txt +3888, usage_txt +3892, usage_txt +3896, usage_txt +3900,
+ usage_txt +3904, usage_txt +3908, usage_txt +3912, usage_txt +3916,
+ usage_txt +3920, usage_txt +3927, usage_txt +3939, usage_txt +3947,
+ usage_txt +3951, usage_txt +3954, usage_txt +3987
}
};
/*
- * $Id: boolean.c,v 4.10 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2007-01-13 10:10:39 bkorb"
+ * $Id: boolean.c,v 4.16 2009/01/01 16:51:47 bkorb Exp $
+ * Time-stamp: "2008-08-03 13:06:02 bkorb"
*
* Automated Options Paged Usage module.
*
* This routine will run run-on options through a pager so the
* user may examine, print or edit them at their leisure.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
*
- * Automated Options 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.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * These files have the following md5sums:
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
/*=export_func optionBooleanVal
char* pz;
ag_bool res = AG_TRUE;
+ if ((pOD->fOptState & OPTST_RESET) != 0)
+ return;
+
+ if (pOD->optArg.argString == NULL) {
+ pOD->optArg.argBool = AG_FALSE;
+ return;
+ }
+
switch (*(pOD->optArg.argString)) {
case '0':
{
/* -*- Mode: C -*- */
-/* --- fake the preprocessor into handlng portability */
-/*
- * Time-stamp: "2007-02-03 17:41:06 bkorb"
+/* compat.h --- fake the preprocessor into handlng portability
+ *
+ * Time-stamp: "2008-06-14 09:36:25 bkorb"
+ *
+ * $Id: compat.h,v 4.21 2009/01/01 16:51:52 bkorb Exp $
+ *
+ * compat.h is free software.
+ * This file is part of AutoGen.
+ *
+ * AutoGen copyright (c) 1992-2009 by Bruce Korb - all rights reserved
+ *
+ * AutoGen 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.
+ *
+ * AutoGen 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.
*
- * Author: Gary V Vaughan <gvaughan@oranda.demon.co.uk>
- * Created: Mon Jun 30 15:54:46 1997
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
*
- * $Id: compat.h,v 4.16 2007/04/27 01:10:47 bkorb Exp $
+ * As a special exception, Bruce Korb gives permission for additional
+ * uses of the text contained in the release of compat.h.
+ *
+ * The exception is that, if you link the compat.h library with other
+ * files to produce an executable, this does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * Your use of that executable is in no way restricted on account of
+ * linking the compat.h library code into it.
+ *
+ * This exception does not however invalidate any other reasons why
+ * the executable file might be covered by the GNU General Public License.
+ *
+ * This exception applies only to the code released by Bruce Korb under
+ * the name compat.h. If you copy code from other sources under the
+ * General Public License into a copy of compat.h, as the General Public
+ * License permits, the exception does not apply to the code that you add
+ * in this way. To avoid misleading anyone as to the status of such
+ * modified files, you must delete this exception notice from them.
+ *
+ * If you write modifications of your own for compat.h, it is your choice
+ * whether to permit this exception to apply to your modifications.
+ * If you do not wish that, delete this exception notice.
*/
#ifndef COMPAT_H_GUARD
#define COMPAT_H_GUARD 1
#ifndef HAVE_UINTPTR_T
typedef unsigned long uintptr_t;
#endif
+#ifndef HAVE_SIZE_T
+ typedef unsigned int size_t;
+#endif
+#ifndef HAVE_WINT_T
+ typedef unsigned int wint_t;
+#endif
+#ifndef HAVE_PID_T
+ typedef signed int pid_t;
+#endif
/* redefine these for BSD style string libraries */
#ifndef HAVE_STRCHR
/*
* Author: Gary V Vaughan <gvaughan@oranda.demon.co.uk>
* Time-stamp: "2006-09-23 19:46:16 bkorb"
- * Created: Tue Jun 24 15:07:31 1997
- * Last Modified: $Date: 2006/11/27 01:52:23 $
+ * Last Modified: $Date: 2007/07/04 20:51:18 $
* by: bkorb
*
- * $Id: pathfind.c,v 4.10 2006/11/27 01:52:23 bkorb Exp $
+ * $Id: pathfind.c,v 4.11 2007/07/04 20:51:18 bkorb Exp $
*/
/* Code: */
/*
- * Time-stamp: "2006-10-14 14:55:09 bkorb"
+ * Time-stamp: "2007-07-04 09:45:44 bkorb"
* by: bkorb
- * Last Committed: $Date: 2007/04/28 22:19:23 $
+ * Last Committed: $Date: 2007/07/04 20:51:18 $
+ *
+ * This file is part of AutoGen.
+ *
+ * AutoGen copyright (c) 1992-2007 Bruce Korb - all rights reserved
+ *
+ * AutoGen 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.
+ *
+ * AutoGen 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 <http://www.gnu.org/licenses/>.
*/
#ifndef WINDOWS_CONFIG_HACKERY
#define WINDOWS_CONFIG_HACKERY 1
/*
- * $Id: configfile.c,v 1.21 2007/04/15 19:01:18 bkorb Exp $
- * Time-stamp: "2007-04-15 11:22:46 bkorb"
+ * $Id: configfile.c,v 1.35 2009/01/18 22:48:51 bkorb Exp $
+ * Time-stamp: "2009-01-18 10:21:58 bkorb"
*
* configuration/rc/ini file handling.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
*
- * Automated Options 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.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * These files have the following md5sums:
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static void
filePreset(
tOptions* pOpts,
char* pzText,
tOptionValue* pType );
-static char*
-parseLoadMode(
- char* pzText,
- tOptionLoadMode* pMode );
-
static char*
parseSetMemType(
tOptions* pOpts,
int direction )
{
tmap_info_t cfgfile;
- tOptState st = OPTSTATE_INITIALIZER(PRESET);
+ tOptState optst = OPTSTATE_INITIALIZER(PRESET);
char* pzFileText =
text_mmap( pzFileName, PROT_READ|PROT_WRITE, MAP_PRIVATE, &cfgfile );
return;
if (direction == DIRECTION_CALLED) {
- st.flags = OPTST_DEFINED;
- direction = DIRECTION_PROCESS;
+ optst.flags = OPTST_DEFINED;
+ direction = DIRECTION_PROCESS;
}
/*
* and we consider stuff set herein to be "set" by the client program.
*/
if ((pOpts->fOptSet & OPTPROC_PRESETTING) == 0)
- st.flags = OPTST_SET;
+ optst.flags = OPTST_SET;
do {
- while (isspace( (int)*pzFileText )) pzFileText++;
+ while (IS_WHITESPACE_CHAR(*pzFileText)) pzFileText++;
- if (isalpha( (int)*pzFileText )) {
- pzFileText = handleConfig( pOpts, &st, pzFileText, direction );
+ if (IS_VAR_FIRST_CHAR(*pzFileText)) {
+ pzFileText = handleConfig(pOpts, &optst, pzFileText, direction);
} else switch (*pzFileText) {
case '<':
- if (isalpha( (int)pzFileText[1] ))
- pzFileText = handleStructure(pOpts, &st, pzFileText, direction);
+ if (IS_VAR_FIRST_CHAR(pzFileText[1]))
+ pzFileText =
+ handleStructure(pOpts, &optst, pzFileText, direction);
else switch (pzFileText[1]) {
case '?':
if (pzEnd == NULL)
return pzText + strlen(pzText);
- while (ISNAMECHAR( (int)*pzText )) pzText++;
- while (isspace( (int)*pzText )) pzText++;
+ while (IS_VALUE_NAME_CHAR(*pzText)) pzText++;
+ while (IS_WHITESPACE_CHAR(*pzText)) pzText++;
if (pzText > pzEnd) {
name_only:
*pzEnd++ = NUL;
* is an invalid format and we give up parsing the text.
*/
if ((*pzText == '=') || (*pzText == ':')) {
- while (isspace( (int)*++pzText )) ;
+ while (IS_WHITESPACE_CHAR(*++pzText)) ;
if (pzText > pzEnd)
goto name_only;
- } else if (! isspace((int)pzText[-1]))
+ } else if (! IS_WHITESPACE_CHAR(pzText[-1]))
return NULL;
/*
size_t name_len;
if ( (strncmp( pzText+2, zProg, title_len ) != 0)
- || (! isspace( (int)pzText[title_len+2] )) ) {
+ || (! IS_WHITESPACE_CHAR(pzText[title_len+2])) ) {
pzText = strchr( pzText+2, '>' );
if (pzText != NULL)
pzText++;
do {
pzText += title_len;
- if (isspace((int)*pzText)) {
- while (isspace((int)*pzText)) pzText++;
+ if (IS_WHITESPACE_CHAR(*pzText)) {
+ while (IS_WHITESPACE_CHAR(*++pzText)) ;
if ( (strneqvcmp( pzText, pOpts->pzProgName, (int)name_len) == 0)
&& (pzText[name_len] == '>')) {
pzText += name_len + 1;
int direction )
{
tOptionLoadMode mode = option_load_mode;
- tOptionValue valu;
+ tOptionValue valu;
char* pzName = ++pzText;
char* pzData;
char* pcNulPoint;
- while (ISNAMECHAR( *pzText )) pzText++;
+ while (IS_VALUE_NAME_CHAR(*pzText)) pzText++;
pcNulPoint = pzText;
valu.valType = OPARG_TYPE_STRING;
*/
memset(pcNulPoint, ' ', pzData - pcNulPoint);
+ /*
+ * If we are getting a "string" value, the process the XML-ish
+ * %XX hex characters.
+ */
+ if (valu.valType == OPARG_TYPE_STRING) {
+ char * pzSrc = pzData;
+ char * pzDst = pzData;
+ char bf[4];
+ bf[2] = NUL;
+
+ for (;;) {
+ int ch = ((int)*(pzSrc++)) & 0xFF;
+ switch (ch) {
+ case NUL: goto string_fixup_done;
+
+ case '%':
+ bf[0] = *(pzSrc++);
+ bf[1] = *(pzSrc++);
+ if ((bf[0] == NUL) || (bf[1] == NUL))
+ goto string_fixup_done;
+ ch = strtoul(bf, NULL, 16);
+ /* FALLTHROUGH */
+
+ default:
+ *(pzDst++) = ch;
+ }
+ } string_fixup_done:;
+ *pzDst = NUL;
+ }
+
/*
* "pzName" points to what looks like text for one option/configurable.
* It is NUL terminated. Process it.
LOCAL void
internalFileLoad( tOptions* pOpts )
{
- int idx;
- int inc = DIRECTION_PRESET;
- char zFileName[ AG_PATH_MAX+1 ];
+ uint32_t svfl;
+ int idx;
+ int inc;
+ char zFileName[ AG_PATH_MAX+1 ];
if (pOpts->papzHomeList == NULL)
return;
+ svfl = pOpts->fOptSet;
+ inc = DIRECTION_PRESET;
+
+ /*
+ * Never stop on errors in config files.
+ */
+ pOpts->fOptSet &= ~OPTPROC_ERRSTOP;
+
/*
* Find the last RC entry (highest priority entry)
*/
}
}
} /* twice for every path in the home list, ... */
+
+ pOpts->fOptSet = svfl;
}
void
optionLoadOpt( tOptions* pOpts, tOptDesc* pOptDesc )
{
+ struct stat sb;
+
/*
* IF the option is not being disabled, THEN load the file. There must
* be a file. (If it is being disabled, then the disablement processing
* already took place. It must be done to suppress preloading of ini/rc
* files.)
*/
- if (! DISABLED_OPT( pOptDesc )) {
- struct stat sb;
- if (stat( pOptDesc->optArg.argString, &sb ) != 0) {
- if ((pOpts->fOptSet & OPTPROC_ERRSTOP) == 0)
- return;
-
- fprintf( stderr, zFSErrOptLoad, errno, strerror( errno ),
- pOptDesc->optArg.argString );
- exit(EX_NOINPUT);
- /* NOT REACHED */
- }
+ if ( DISABLED_OPT(pOptDesc)
+ || ((pOptDesc->fOptState & OPTST_RESET) != 0))
+ return;
- if (! S_ISREG( sb.st_mode )) {
- if ((pOpts->fOptSet & OPTPROC_ERRSTOP) == 0)
- return;
+ if (stat( pOptDesc->optArg.argString, &sb ) != 0) {
+ if ((pOpts->fOptSet & OPTPROC_ERRSTOP) == 0)
+ return;
- fprintf( stderr, zNotFile, pOptDesc->optArg.argString );
- exit(EX_NOINPUT);
- /* NOT REACHED */
- }
+ fprintf( stderr, zFSErrOptLoad, errno, strerror( errno ),
+ pOptDesc->optArg.argString );
+ exit(EX_NOINPUT);
+ /* NOT REACHED */
+ }
- filePreset(pOpts, pOptDesc->optArg.argString, DIRECTION_CALLED);
+ if (! S_ISREG( sb.st_mode )) {
+ if ((pOpts->fOptSet & OPTPROC_ERRSTOP) == 0)
+ return;
+
+ fprintf( stderr, zNotFile, pOptDesc->optArg.argString );
+ exit(EX_NOINPUT);
+ /* NOT REACHED */
}
+
+ filePreset(pOpts, pOptDesc->optArg.argString, DIRECTION_CALLED);
}
tOptionLoadMode* pMode,
tOptionValue* pType )
{
- size_t lenLoadType = strlen( zLoadType );
- size_t lenKeyWords = strlen( zKeyWords );
- size_t lenSetMem = strlen( zSetMembers );
+ size_t len;
do {
- switch (*pzText) {
- case '/': pType->valType = OPARG_TYPE_NONE;
- case '>': return pzText;
+ if (! IS_WHITESPACE_CHAR(*pzText))
+ switch (*pzText) {
+ case '/': pType->valType = OPARG_TYPE_NONE;
+ case '>': return pzText;
- default:
- case NUL: return NULL;
-
- case ' ':
- case '\t':
- case '\n':
- case '\f':
- case '\r':
- case '\v':
+ default:
+ case NUL: return NULL;
+ }
+
+ while (IS_WHITESPACE_CHAR(*++pzText)) ;
+ len = 0;
+ while (IS_LOWER_CASE_CHAR(pzText[len])) len++;
+
+ switch (find_xat_attribute_id(pzText, len)) {
+ case XAT_KWD_TYPE:
+ pzText = parseValueType( pzText+len, pType );
break;
- }
- while (isspace( (int)*++pzText )) ;
+ case XAT_KWD_WORDS:
+ pzText = parseKeyWordType( pOpts, pzText+len, pType );
+ break;
- if (strncmp( pzText, zLoadType, lenLoadType ) == 0) {
- pzText = parseValueType( pzText+lenLoadType, pType );
- continue;
- }
+ case XAT_KWD_MEMBERS:
+ pzText = parseSetMemType( pOpts, pzText+len, pType );
+ break;
- if (strncmp( pzText, zKeyWords, lenKeyWords ) == 0) {
- pzText = parseKeyWordType( pOpts, pzText+lenKeyWords, pType );
- continue;
- }
+ case XAT_KWD_COOKED:
+ pzText += len;
+ if (! IS_END_XML_TOKEN_CHAR(*pzText))
+ goto invalid_kwd;
- if (strncmp( pzText, zSetMembers, lenSetMem ) == 0) {
- pzText = parseSetMemType( pOpts, pzText+lenSetMem, pType );
- continue;
- }
+ *pMode = OPTION_LOAD_COOKED;
+ break;
+
+ case XAT_KWD_UNCOOKED:
+ pzText += len;
+ if (! IS_END_XML_TOKEN_CHAR(*pzText))
+ goto invalid_kwd;
+
+ *pMode = OPTION_LOAD_UNCOOKED;
+ break;
+
+ case XAT_KWD_KEEP:
+ pzText += len;
+ if (! IS_END_XML_TOKEN_CHAR(*pzText))
+ goto invalid_kwd;
+
+ *pMode = OPTION_LOAD_KEEP;
+ break;
- pzText = parseLoadMode( pzText, pMode );
+ default:
+ case XAT_KWD_INVALID:
+ invalid_kwd:
+ pType->valType = OPARG_TYPE_NONE;
+ return skipUnknown( pzText );
+ }
} while (pzText != NULL);
return pzText;
}
-/* parseLoadMode
- *
- * "pzText" points to some name character. We check for "cooked" or
- * "uncooked" or "keep". This function should handle any attribute
- * that does not have an associated value.
- */
-static char*
-parseLoadMode(
- char* pzText,
- tOptionLoadMode* pMode )
-{
- {
- size_t len = strlen(zLoadCooked);
- if (strncmp( pzText, zLoadCooked, len ) == 0) {
- if ( (pzText[len] == '>')
- || (pzText[len] == '/')
- || isspace((int)pzText[len])) {
- *pMode = OPTION_LOAD_COOKED;
- return pzText + len;
- }
- goto unknown;
- }
- }
-
- {
- size_t len = strlen(zLoadUncooked);
- if (strncmp( pzText, zLoadUncooked, len ) == 0) {
- if ( (pzText[len] == '>')
- || (pzText[len] == '/')
- || isspace((int)pzText[len])) {
- *pMode = OPTION_LOAD_UNCOOKED;
- return pzText + len;
- }
- goto unknown;
- }
- }
-
- {
- size_t len = strlen(zLoadKeep);
- if (strncmp( pzText, zLoadKeep, len ) == 0) {
- if ( (pzText[len] == '>')
- || (pzText[len] == '/')
- || isspace((int)pzText[len])) {
- *pMode = OPTION_LOAD_KEEP;
- return pzText + len;
- }
- goto unknown;
- }
- }
-
- unknown:
- return skipUnknown( pzText );
-}
-
-
/* parseSetMemType
*
* "pzText" points to the character after "members="
char* pzText,
tOptionValue* pType )
{
- {
- size_t len = strlen(zLtypeString);
- if (strncmp( pzText, zLtypeString, len ) == 0) {
- if ((pzText[len] == '>') || isspace((int)pzText[len])) {
- pType->valType = OPARG_TYPE_STRING;
- return pzText + len;
- }
- goto unknown;
- }
- }
+ size_t len = 0;
- {
- size_t len = strlen(zLtypeInteger);
- if (strncmp( pzText, zLtypeInteger, len ) == 0) {
- if ((pzText[len] == '>') || isspace((int)pzText[len])) {
- pType->valType = OPARG_TYPE_NUMERIC;
- return pzText + len;
- }
- goto unknown;
- }
- }
+ if (*(pzText++) != '=')
+ goto woops;
- {
- size_t len = strlen(zLtypeBool);
- if (strncmp( pzText, zLtypeBool, len ) == 0) {
- if ((pzText[len] == '>') || isspace(pzText[len])) {
- pType->valType = OPARG_TYPE_BOOLEAN;
- return pzText + len;
- }
- goto unknown;
- }
- }
+ while (IS_OPTION_NAME_CHAR(pzText[len])) len++;
+ pzText += len;
- {
- size_t len = strlen(zLtypeKeyword);
- if (strncmp( pzText, zLtypeKeyword, len ) == 0) {
- if ((pzText[len] == '>') || isspace((int)pzText[len])) {
- pType->valType = OPARG_TYPE_ENUMERATION;
- return pzText + len;
- }
- goto unknown;
- }
+ if ((len == 0) || (! IS_END_XML_TOKEN_CHAR(*pzText))) {
+ woops:
+ pType->valType = OPARG_TYPE_NONE;
+ return skipUnknown( pzText );
}
- {
- size_t len = strlen(zLtypeSetMembership);
- if (strncmp( pzText, zLtypeSetMembership, len ) == 0) {
- if ((pzText[len] == '>') || isspace((int)pzText[len])) {
- pType->valType = OPARG_TYPE_MEMBERSHIP;
- return pzText + len;
- }
- goto unknown;
- }
- }
+ switch (find_value_type_id(pzText - len, len)) {
+ default:
+ case VTP_KWD_INVALID: goto woops;
- {
- size_t len = strlen(zLtypeNest);
- if (strncmp( pzText, zLtypeNest, len ) == 0) {
- if ((pzText[len] == '>') || isspace((int)pzText[len])) {
- pType->valType = OPARG_TYPE_HIERARCHY;
- return pzText + len;
- }
- goto unknown;
- }
+ case VTP_KWD_STRING:
+ pType->valType = OPARG_TYPE_STRING;
+ break;
+
+ case VTP_KWD_INTEGER:
+ pType->valType = OPARG_TYPE_NUMERIC;
+ break;
+
+ case VTP_KWD_BOOL:
+ case VTP_KWD_BOOLEAN:
+ pType->valType = OPARG_TYPE_BOOLEAN;
+ break;
+
+ case VTP_KWD_KEYWORD:
+ pType->valType = OPARG_TYPE_ENUMERATION;
+ break;
+
+ case VTP_KWD_SET:
+ case VTP_KWD_SET_MEMBERSHIP:
+ pType->valType = OPARG_TYPE_MEMBERSHIP;
+ break;
+
+ case VTP_KWD_NESTED:
+ case VTP_KWD_HIERARCHY:
+ pType->valType = OPARG_TYPE_HIERARCHY;
}
- unknown:
- pType->valType = OPARG_TYPE_NONE;
- return skipUnknown( pzText );
+ return pzText;
}
skipUnknown( char* pzText )
{
for (;; pzText++) {
- if (isspace( (int)*pzText )) return pzText;
- switch (*pzText) {
- case NUL: return NULL;
- case '/':
- case '>': return pzText;
- }
+ if (IS_END_XML_TOKEN_CHAR(*pzText)) return pzText;
+ if (*pzText == NUL) return NULL;
}
}
* is available, then go do it.
*/
if ( ((pOpts->fOptSet & OPTPROC_TRANSLATE) != 0)
- && (pOpts->pTransProc != 0) ) {
+ && (pOpts->pTransProc != NULL) ) {
+ /*
+ * If option names are not to be translated at all, then do not do
+ * it for configuration parsing either. (That is the bit that really
+ * gets tested anyway.)
+ */
+ if ((pOpts->fOptSet & OPTPROC_NO_XLAT_MASK) == OPTPROC_NXLAT_OPT)
+ pOpts->fOptSet |= OPTPROC_NXLAT_OPT_CFG;
(*pOpts->pTransProc)();
pOpts->fOptSet &= ~OPTPROC_TRANSLATE;
}
|| (pOpts->structVersion < OPTIONS_MINIMUM_VERSION )
) ) {
- fprintf( stderr, zAO_Err, pOpts->origArgVect[0],
- NUM_TO_VER( pOpts->structVersion ));
+ fprintf(stderr, zAO_Err, pzProgram, NUM_TO_VER(pOpts->structVersion));
if (pOpts->structVersion > OPTIONS_STRUCT_VERSION )
fputs( zAO_Big, stderr );
else
-
/*
- * $Id: cook.c,v 4.10 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2006-09-24 15:21:02 bkorb"
+ * $Id: cook.c,v 4.17 2009/01/01 16:51:47 bkorb Exp $
+ * Time-stamp: "2007-11-16 22:49:11 bkorb"
*
* This file contains the routines that deal with processing quoted strings
* into an internal format.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
*
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * Automated Options 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.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * These files have the following md5sums:
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
- *
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
/* = = = END-STATIC-FORWARD = = = */
/*=export_func ao_string_cook_escape_char
case 't': *pRes = '\t'; break;
case 'v': *pRes = '\v'; break;
- case 'x': /* HEX Escape */
- if (isxdigit( (int)*pzIn )) {
- unsigned int val;
- unsigned char ch = *pzIn++;
-
- if ((ch >= 'A') && (ch <= 'F'))
- val = 10 + (ch - 'A');
- else if ((ch >= 'a') && (ch <= 'f'))
- val = 10 + (ch - 'a');
- else val = ch - '0';
-
- ch = *pzIn;
+ case 'x':
+ case 'X': /* HEX Escape */
+ if (IS_HEX_DIGIT_CHAR(*pzIn)) {
+ char z[4], *pz = z;
- if (! isxdigit( ch )) {
- *pRes = val;
- res = 2;
- break;
- }
- val <<= 4;
- if ((ch >= 'A') && (ch <= 'F'))
- val += 10 + (ch - 'A');
- else if ((ch >= 'a') && (ch <= 'f'))
- val += 10 + (ch - 'a');
- else val += ch - '0';
-
- res = 3;
- *pRes = val;
+ do *(pz++) = *(pzIn++);
+ while (IS_HEX_DIGIT_CHAR(*pzIn) && (pz < z + 2));
+ *pz = NUL;
+ *pRes = (unsigned char)strtoul(z, NULL, 16);
+ res += pz - z;
}
break;
- default:
+ case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7':
+ {
/*
* IF the character copied was an octal digit,
* THEN set the output character to an octal value
*/
- if (isdigit( (int)*pRes ) && (*pRes < '8')) {
- unsigned int val = *pRes - '0';
- unsigned char ch = *pzIn++;
-
- /*
- * IF the second character is *not* an octal digit,
- * THEN save the value and bail
- */
- if ((ch < '0') || (ch > '7')) {
- *pRes = val;
- break;
- }
-
- val = (val<<3) + (ch - '0');
- ch = *pzIn;
- res = 2;
-
- /*
- * IF the THIRD character is *not* an octal digit,
- * THEN save the value and bail
- */
- if ((ch < '0') || (ch > '7')) {
- *pRes = val;
- break;
- }
-
- /*
- * IF the new value would not be too large,
- * THEN add on the third and last character value
- */
- if ((val<<3) < 0xFF) {
- val = (val<<3) + (ch - '0');
- res = 3;
- }
+ char z[4], *pz = z + 1;
+ unsigned long val;
+ z[0] = *pRes;
+
+ while (IS_OCT_DIGIT_CHAR(*pzIn) && (pz < z + 3))
+ *(pz++) = *(pzIn++);
+ *pz = NUL;
+ val = strtoul(z, NULL, 8);
+ if (val > 0xFF)
+ val = 0xFF;
+ *pRes = (unsigned char)val;
+ res = pz - z;
+ break;
+ }
- *pRes = val;
- break;
- }
+ default: ;
}
return res;
pzS++;
scan_for_quote:
- while (isspace((int)*pzS))
+ while (IS_WHITESPACE_CHAR(*pzS))
if (*(pzS++) == '\n')
(*pLineCt)++;
/*
- * $Id: enumeration.c,v 4.17 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2007-01-13 10:22:35 bkorb"
+ * $Id: enumeration.c,v 4.25 2009/01/01 16:51:47 bkorb Exp $
+ * Time-stamp: "2008-07-27 12:28:01 bkorb"
*
* Automated Options Paged Usage module.
*
* This routine will run run-on options through a pager so the
* user may examine, print or edit them at their leisure.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
+ * These files have the following md5sums:
*
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
tSCC* pz_enum_err_fmt;
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static void
enumError(
tOptions* pOpts,
{
size_t max_len = 0;
size_t ttl_len = 0;
+ int ct_down = name_ct;
+ int hidden = 0;
- if (pOpts != NULL)
- fprintf( option_usage_fp, pz_enum_err_fmt, pOpts->pzProgName,
- pOD->optArg.argString, pOD->pz_Name );
+ /*
+ * A real "pOpts" pointer means someone messed up. Give a real error.
+ */
+ if (pOpts > OPTPROC_EMIT_LIMIT)
+ fprintf(option_usage_fp, pz_enum_err_fmt, pOpts->pzProgName,
+ pOD->optArg.argString, pOD->pz_Name);
- fprintf( option_usage_fp, zValidKeys, pOD->pz_Name );
+ fprintf(option_usage_fp, zValidKeys, pOD->pz_Name);
+ /*
+ * If the first name starts with this funny character, then we have
+ * a first value with an unspellable name. You cannot specify it.
+ * So, we don't list it either.
+ */
if (**paz_names == 0x7F) {
paz_names++;
- name_ct--;
+ hidden = 1;
+ ct_down = --name_ct;
}
/*
*/
{
tCC * const * paz = paz_names;
- int ct = name_ct;
do {
size_t len = strlen( *(paz++) ) + 1;
if (len > max_len)
max_len = len;
ttl_len += len;
- } while (--ct > 0);
+ } while (--ct_down > 0);
+
+ ct_down = name_ct;
}
/*
if (max_len > 35) {
do {
fprintf( option_usage_fp, " %s\n", *(paz_names++) );
- } while (--name_ct > 0);
+ } while (--ct_down > 0);
}
/*
do {
fputc( ' ', option_usage_fp );
fputs( *(paz_names++), option_usage_fp );
- } while (--name_ct > 0);
+ } while (--ct_down > 0);
fputc( '\n', option_usage_fp );
}
/*
* Loop through all but the last entry
*/
- while (--name_ct > 0) {
+ ct_down = name_ct;
+ while (--ct_down > 0) {
if (++ent_no == max_len) {
/*
* Last entry on a line. Start next line, too.
}
else
- fprintf( option_usage_fp, zFmt, *(paz_names++) );
+ fprintf(option_usage_fp, zFmt, *(paz_names++) );
}
- fprintf( option_usage_fp, "%s\n", *paz_names );
+ fprintf(option_usage_fp, "%s\n", *paz_names);
}
- /*
- * IF we do not have a pOpts pointer, then this output is being requested
- * by the usage procedure. Let's not re-invoke it recursively.
- */
- if (pOpts != NULL)
+ if (pOpts > OPTPROC_EMIT_LIMIT) {
+ fprintf(option_usage_fp, zIntRange, hidden, name_ct - 1 + hidden);
+
(*(pOpts->pUsageProc))( pOpts, EXIT_FAILURE );
- if (OPTST_GET_ARGTYPE(pOD->fOptState) == OPARG_TYPE_MEMBERSHIP)
- fputs( zSetMemberSettings, option_usage_fp );
+ /* NOTREACHED */
+ }
+
+
+ if (OPTST_GET_ARGTYPE(pOD->fOptState) == OPARG_TYPE_MEMBERSHIP) {
+ fprintf(option_usage_fp, zLowerBits, name_ct);
+ fputs(zSetMemberSettings, option_usage_fp);
+ } else {
+ fprintf(option_usage_fp, zIntRange, hidden, name_ct - 1 + hidden);
+ }
}
tCC* const * paz_names,
unsigned int name_ct )
{
+ /*
+ * Return the matching index as a pointer sized integer.
+ * The result gets stashed in a char* pointer.
+ */
uintptr_t res = name_ct;
size_t len = strlen( (char*)pzName );
uintptr_t idx;
+
+ if (IS_DEC_DIGIT_CHAR(*pzName)) {
+ char * pz = (char *)(void *)pzName;
+ unsigned long val = strtoul(pz, &pz, 0);
+ if ((*pz == NUL) && (val < name_ct))
+ return (uintptr_t)val;
+ enumError(pOpts, pOD, paz_names, (int)name_ct);
+ return name_ct;
+ }
+
/*
* Look for an exact match, but remember any partial matches.
* Multiple partial matches means we have an ambiguous match.
if (paz_names[idx][len] == NUL)
return idx; /* full match */
- if (res != name_ct) {
- pz_enum_err_fmt = zAmbigKey;
- option_usage_fp = stderr;
- enumError( pOpts, pOD, paz_names, (int)name_ct );
- }
- res = idx; /* save partial match */
+ res = (res != name_ct) ? ~0 : idx; /* save partial match */
}
}
- /*
- * no partial match -> error
- */
- if (res == name_ct) {
- pz_enum_err_fmt = zNoKey;
- option_usage_fp = stderr;
- enumError( pOpts, pOD, paz_names, (int)name_ct );
- }
+ if (res < name_ct)
+ return res; /* partial match */
- /*
- * Return the matching index as a char* pointer.
- * The result gets stashed in a char* pointer, so it will have to fit.
- */
- return res;
+ pz_enum_err_fmt = (res == name_ct) ? zNoKey : zAmbigKey;
+ option_usage_fp = stderr;
+ enumError(pOpts, pOD, paz_names, (int)name_ct);
+ return name_ct;
}
tOptDesc od;
od.optArg.argEnum = enum_val;
- (*(pOD->pOptProc))( (void*)(2UL), &od );
+ (*(pOD->pOptProc))(OPTPROC_RETURN_VALNAME, &od );
return od.optArg.argString;
}
* then it is some sort of special request.
*/
switch ((uintptr_t)pOpts) {
- case 0UL:
+ case (uintptr_t)OPTPROC_EMIT_USAGE:
/*
* print the list of enumeration names.
*/
- enumError( pOpts, pOD, paz_names, (int)name_ct );
+ enumError(pOpts, pOD, paz_names, (int)name_ct);
break;
- case 1UL:
+ case (uintptr_t)OPTPROC_EMIT_SHELL:
{
unsigned int ix = pOD->optArg.argEnum;
/*
break;
}
- case 2UL:
+ case (uintptr_t)OPTPROC_RETURN_VALNAME:
{
tSCC zInval[] = "*INVALID*";
unsigned int ix = pOD->optArg.argEnum;
if (ix >= name_ct)
return (uintptr_t)zInval;
- res = (uintptr_t)paz_names[ ix ];
+ pOD->optArg.argString = paz_names[ix];
break;
}
default:
- res = findName( pOD->optArg.argString, pOpts, pOD, paz_names, name_ct );
+ res = findName(pOD->optArg.argString, pOpts, pOD, paz_names, name_ct);
if (pOD->fOptState & OPTST_ALLOC_ARG) {
AGFREE(pOD->optArg.argString);
* then it is some sort of special request.
*/
switch ((uintptr_t)pOpts) {
- case 0UL:
+ case (uintptr_t)OPTPROC_EMIT_USAGE:
/*
* print the list of enumeration names.
*/
- enumError( pOpts, pOD, paz_names, (int)name_ct );
+ enumError(OPTPROC_EMIT_USAGE, pOD, paz_names, (int)name_ct );
return;
- case 1UL:
+ case (uintptr_t)OPTPROC_EMIT_SHELL:
{
/*
* print the name string.
*/
+ int ix = 0;
uintptr_t bits = (uintptr_t)pOD->optCookie;
- uintptr_t res = 0;
size_t len = 0;
+ bits &= ((uintptr_t)1 << (uintptr_t)name_ct) - (uintptr_t)1;
+
while (bits != 0) {
if (bits & 1) {
if (len++ > 0) fputs( " | ", stdout );
- fputs( paz_names[ res ], stdout );
+ fputs(paz_names[ix], stdout);
}
- if (++res >= name_ct) break;
+ if (++ix >= name_ct) break;
bits >>= 1;
}
return;
}
- case 2UL:
+ case (uintptr_t)OPTPROC_RETURN_VALNAME:
{
char* pz;
uintptr_t bits = (uintptr_t)pOD->optCookie;
- uintptr_t res = 0;
- size_t len = 0;
+ int ix = 0;
+ size_t len = 5;
+
+ bits &= ((uintptr_t)1 << (uintptr_t)name_ct) - (uintptr_t)1;
/*
* Replace the enumeration value with the name string.
*/
while (bits != 0) {
if (bits & 1)
- len += strlen( paz_names[ res ]) + 8;
- if (++res >= name_ct) break;
+ len += strlen( paz_names[ix]) + 8;
+ if (++ix >= name_ct) break;
bits >>= 1;
}
- pOD->optArg.argString = pz = AGALOC( len, "enum name" );
+ pOD->optArg.argString = pz = AGALOC(len, "enum name");
/*
* Start by clearing all the bits. We want to turn off any defaults
strcpy( pz, "none" );
pz += 4;
bits = (uintptr_t)pOD->optCookie;
- res = 0;
+ bits &= ((uintptr_t)1 << (uintptr_t)name_ct) - (uintptr_t)1;
+ ix = 0;
+
while (bits != 0) {
if (bits & 1) {
strcpy( pz, " + " );
- strcpy( pz+3, paz_names[ res ]);
- pz += strlen( paz_names[ res ]) + 3;
+ strcpy( pz+3, paz_names[ix]);
+ pz += strlen( paz_names[ix]) + 3;
}
- if (++res >= name_ct) break;
+ if (++ix >= name_ct) break;
bits >>= 1;
}
return;
break;
}
+ if ((pOD->fOptState & OPTST_RESET) != 0)
+ return;
+
{
tCC* pzArg = pOD->optArg.argString;
uintptr_t res;
if (pz != pzArg + len) {
char z[ AO_NAME_SIZE ];
tCC* p;
+ int shift_ct;
+
if (*pz != NUL) {
if (len >= AO_NAME_LIMIT)
break;
p = pzArg;
}
- bit = 1UL << findName(p, pOpts, pOD, paz_names, name_ct);
+ shift_ct = findName(p, pOpts, pOD, paz_names, name_ct);
+ if (shift_ct >= name_ct) {
+ pOD->optCookie = (void*)0;
+ return;
+ }
+ bit = 1UL << shift_ct;
}
if (iv)
res &= ~bit;
/*
- * $Id: environment.c,v 4.13 2007/04/15 19:01:18 bkorb Exp $
- * Time-stamp: "2007-04-15 11:50:35 bkorb"
+ * $Id: environment.c,v 4.19 2009/01/17 22:08:07 bkorb Exp $
+ * Time-stamp: "2009-01-12 05:52:44 bkorb"
*
* This file contains all of the routines that must be linked into
* an executable to use the generated option processing. The optional
* routines are in separately compiled modules so that they will not
* necessarily be linked in.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
*
- * Automated Options 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.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * These files have the following md5sums:
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static void
checkEnvOpt(tOptState * os, char * env_name,
tOptions* pOpts, teEnvPresetType type);
char** sv_argv;
/*
- * IF there is no such environment variable
- * *or* there is, but we are doing immediate opts and there are
- * no immediate opts to do (--help inside $PROGNAME is silly,
- * but --no-load-defs is not, so that is marked)
- * THEN bail out now. (
+ * No such beast? Then bail now.
*/
- if ( (pczOptStr == NULL)
- || ( (type == ENV_IMM)
- && ((pOpts->fOptSet & OPTPROC_HAS_IMMED) == 0) ) )
+ if (pczOptStr == NULL)
return;
/*
switch (type) {
case ENV_IMM:
- /*
- * We know the OPTPROC_HAS_IMMED bit is set.
- */
(void)doImmediateOpts( pOpts );
break;
- case ENV_NON_IMM:
- (void)doRegularOpts( pOpts );
- break;
+ case ENV_ALL:
+ (void)doImmediateOpts( pOpts );
+ pOpts->curOptIdx = 1;
+ pOpts->pzCurOpt = NULL;
+ /* FALLTHROUGH */
- default:
- /*
- * Only to immediate opts if the OPTPROC_HAS_IMMED bit is set.
- */
- if (pOpts->fOptSet & OPTPROC_HAS_IMMED) {
- (void)doImmediateOpts( pOpts );
- pOpts->curOptIdx = 1;
- pOpts->pzCurOpt = NULL;
- }
+ case ENV_NON_IMM:
(void)doRegularOpts( pOpts );
- break;
}
/*
--- /dev/null
+
+/*
+ * $Id: file.c,v 1.7 2009/01/01 16:51:47 bkorb Exp $
+ * Time-stamp: "2008-12-06 10:15:33 bkorb"
+ *
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
+ *
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
+ *
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
+ *
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
+ *
+ * These files have the following md5sums:
+ *
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
+ */
+
+/*=export_func optionFileCheck
+ * private:
+ *
+ * what: Decipher a boolean value
+ * arg: + tOptions* + pOpts + program options descriptor +
+ * arg: + tOptDesc* + pOptDesc + the descriptor for this arg +
+ * arg: + teOptFileType + ftype + File handling type +
+ * arg: + tuFileMode + mode + file open mode (if needed) +
+ *
+ * doc:
+ * Make sure the named file conforms with the file type mode.
+ * The mode specifies if the file must exist, must not exist or may
+ * (or may not) exist. The mode may also specify opening the
+ * file: don't, open just the descriptor (fd), or open as a stream
+ * (FILE* pointer).
+=*/
+void
+optionFileCheck(tOptions* pOpts, tOptDesc* pOD,
+ teOptFileType ftype, tuFileMode mode)
+{
+ if (pOpts <= OPTPROC_EMIT_LIMIT) {
+ if (pOpts != OPTPROC_EMIT_USAGE)
+ return;
+
+ switch (ftype & FTYPE_MODE_EXIST_MASK) {
+ case FTYPE_MODE_MUST_NOT_EXIST:
+ fputs(zFileCannotExist, option_usage_fp);
+ break;
+
+ case FTYPE_MODE_MUST_EXIST:
+ fputs(zFileMustExist, option_usage_fp);
+ break;
+ }
+ return;
+ }
+
+ if ((pOD->fOptState & OPTST_RESET) != 0) {
+ if (pOD->optCookie != NULL)
+ AGFREE(pOD->optCookie);
+ return;
+ }
+
+ {
+ struct stat sb;
+
+ errno = 0;
+
+ switch (ftype & FTYPE_MODE_EXIST_MASK) {
+ case FTYPE_MODE_MUST_NOT_EXIST:
+ if ( (stat(pOD->optArg.argString, &sb) == 0)
+ || (errno != ENOENT) ){
+ if (errno == 0)
+ errno = EINVAL;
+ fprintf(stderr, zFSOptError, errno, strerror(errno),
+ zFSOptErrNoExist, pOD->optArg.argString, pOD->pz_Name);
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ /* NOTREACHED */
+ }
+ /* FALLTHROUGH */
+
+ default:
+ case FTYPE_MODE_MAY_EXIST:
+ {
+ char * p = strrchr(pOD->optArg.argString, DIRCH);
+ if (p != NULL)
+ *p = NUL;
+ if ( (stat(pOD->optArg.argString, &sb) != 0)
+ || (errno = EINVAL, ! S_ISDIR(sb.st_mode)) ){
+ fprintf(stderr, zFSOptError, errno, strerror(errno),
+ zFSOptErrMayExist, pOD->optArg.argString, pOD->pz_Name);
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ /* NOTREACHED */
+ }
+ *p = '/';
+ break;
+ }
+
+ case FTYPE_MODE_MUST_EXIST:
+ if ( (stat(pOD->optArg.argString, &sb) != 0)
+ || (errno = EINVAL, ! S_ISREG(sb.st_mode)) ){
+ fprintf(stderr, zFSOptError, errno, strerror(errno),
+ zFSOptErrMustExist, pOD->optArg.argString,
+ pOD->pz_Name);
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ /* NOTREACHED */
+ }
+ break;
+ }
+ }
+
+ switch (ftype & FTYPE_MODE_OPEN_MASK) {
+ default:
+ case FTYPE_MODE_NO_OPEN:
+ break;
+
+ case FTYPE_MODE_OPEN_FD:
+ {
+ int fd = open(pOD->optArg.argString, mode.file_flags);
+ if (fd < 0) {
+ fprintf(stderr, zFSOptError, errno, strerror(errno),
+ zFSOptErrOpen, pOD->optArg.argString, pOD->pz_Name);
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ /* NOTREACHED */
+ }
+
+ if ((pOD->fOptState & OPTST_ALLOC_ARG) != 0)
+ pOD->optCookie = (void *)pOD->optArg.argString;
+ else
+ AGDUPSTR(pOD->optCookie, pOD->optArg.argString, "file name");
+
+ pOD->optArg.argFd = fd;
+ pOD->fOptState &= ~OPTST_ALLOC_ARG;
+ break;
+ }
+
+ case FTYPE_MODE_FOPEN_FP:
+ {
+ FILE* fp = fopen(pOD->optArg.argString, mode.file_mode);
+ if (fp == NULL) {
+ fprintf(stderr, zFSOptError, errno, strerror(errno),
+ zFSOptErrFopen, pOD->optArg.argString, pOD->pz_Name);
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ /* NOTREACHED */
+ }
+
+ if ((pOD->fOptState & OPTST_ALLOC_ARG) != 0)
+ pOD->optCookie = (void *)pOD->optArg.argString;
+ else
+ AGDUPSTR(pOD->optCookie, pOD->optArg.argString, "file name");
+
+ pOD->optArg.argFp = fp;
+ pOD->fOptState &= ~OPTST_ALLOC_ARG;
+ break;
+ }
+ }
+}
+/*
+ * Local Variables:
+ * mode: C
+ * c-file-style: "stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * end of autoopts/file.c */
*
* DO NOT EDIT THIS FILE (genshell.c)
*
- * It has been AutoGen-ed Saturday May 5, 2007 at 12:02:35 PM PDT
+ * It has been AutoGen-ed Saturday May 16, 2009 at 08:15:54 AM PDT
* From the definitions genshell.def
* and the template file options
*
- * Generated from AutoOpts 29:0:4 templates.
+ * Generated from AutoOpts @AO_CURRENT@:@AO_REVISION@:@AO_AGE@ templates.
*/
/*
*
* This source file is copyrighted and licensed under the following terms:
*
- * genshellopt copyright 1999-2007 Bruce Korb - all rights reserved
+ * genshellopt copyright 1999-2009 Bruce Korb - all rights reserved
*
- * genshellopt is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
+ * genshellopt 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.
*
- * genshellopt 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
- * Lesser General Public License for more details.
+ * genshellopt 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 Lesser General Public
- * License along with genshellopt. If not, write to:
- * The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301, USA.
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-
+#include <sys/types.h>
#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
#define OPTION_CODE_COMPILE 1
#include "genshell.h"
#ifdef __cplusplus
extern "C" {
#endif
+
+/* TRANSLATORS: choose the translation for option names wisely because you
+ cannot ever change your mind. */
tSCC zCopyright[] =
- "genshellopt copyright (c) 1999-2007 Bruce Korb, all rights reserved";
-tSCC zCopyrightNotice[] =
- "genshellopt is free software; you can redistribute it and/or\n\
-modify it under the terms of the GNU Lesser General Public\n\
-License as published by the Free Software Foundation; either\n\
-version 2.1 of the License, or (at your option) any later version.\n\n\
-genshellopt is distributed in the hope that it will be useful,\n\
-but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n\
-Lesser General Public License for more details.\n\n\
-You should have received a copy of the GNU Lesser General Public\n\
-License along with genshellopt. If not, write to:\n\
-\tThe Free Software Foundation, Inc.,\n\
-\t51 Franklin Street, Fifth Floor\n\
-\tBoston, MA 02110-1301, USA.";
+ "genshellopt copyright (c) 1999-2009 Bruce Korb, all rights reserved";
+tSCC zCopyrightNotice[610] =
+"genshellopt is free software: you can redistribute it and/or modify it under\n\
+the terms of the GNU General Public License as published by the Free Software\n\
+Foundation, either version 3 of the License, or (at your option) any later\n\
+version.\n\n\
+genshellopt is distributed in the hope that it will be useful, but WITHOUT ANY\n\
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n\
+PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\n\
+You should have received a copy of the GNU General Public License along with\n\
+this program. If not, see <http://www.gnu.org/licenses/>.";
+
extern tUsageProc genshelloptUsage;
#ifndef NULL
/*
* Help/More_Help/Version option descriptions:
*/
-tSCC zHelpText[] = "Display usage information and exit";
-tSCC zHelp_Name[] = "help";
-
-tSCC zMore_HelpText[] = "Extended usage information passed thru pager";
-tSCC zMore_Help_Name[] = "more-help";
-
-tSCC zVersionText[] = "Output version information and exit";
-tSCC zVersion_Name[] = "version";
+tSCC zHelpText[] = "Display usage information and exit";
+tSCC zHelp_Name[] = "help";
+tSCC zMore_HelpText[] = "Extended usage information passed thru pager";
+tSCC zMore_Help_Name[] = "more-help";
+tSCC zVersionText[] = "Output version information and exit";
+tSCC zVersion_Name[] = "version";
/*
* Declare option callback procedures
*/
text, the second line of the file through the ending tag will be replaced\n\
by the newly generated text. The first `#!' line will be regenerated.\n";
tSCC zFullVersion[] = GENSHELLOPT_FULL_VERSION;
-/* extracted from optcode.tpl near line 408 */
+/* extracted from optcode.tpl near line 501 */
#if defined(ENABLE_NLS)
# define OPTPROC_BASE OPTPROC_TRANSLATE
# define translate_option_strings NULL
#endif /* ENABLE_NLS */
+
+#define genshellopt_full_usage NULL
+#define genshellopt_short_usage NULL
tOptions genshelloptOptions = {
OPTIONS_STRUCT_VERSION,
0, NULL, /* original argc + argv */
/*
* Indexes to special options
*/
- { INDEX_OPT_MORE_HELP,
- 0 /* no option state saving */,
- NO_EQUIVALENT /* index of '-#' option */,
+ { INDEX_OPT_MORE_HELP, /* more-help option index */
+ NO_EQUIVALENT, /* save option index */
+ NO_EQUIVALENT, /* '-#' option index */
NO_EQUIVALENT /* index of default opt */
},
- 5 /* full option count */, 2 /* user option count */
+ 5 /* full option count */, 2 /* user option count */,
+ genshellopt_full_usage, genshellopt_short_usage,
+ NULL, NULL
};
/*
tOptions* pOptions,
tOptDesc* pOptDesc )
{
+ (void)pOptions;
USAGE( EXIT_SUCCESS );
}
-/* extracted from optcode.tpl near line 514 */
+/* extracted from optcode.tpl near line 633 */
#if ENABLE_NLS
#include <stdio.h>
* Guard against re-translation. It won't work. The strings will have
* been changed by the first pass through this code. One shot only.
*/
- if (option_usage_text.field_ct == 0)
- return;
- /*
- * Do the translations. The first pointer follows the field count field.
- * The field count field is the size of a pointer.
- */
- {
- char** ppz = (char**)(void*)&(option_usage_text);
- int ix = option_usage_text.field_ct;
+ if (option_usage_text.field_ct != 0) {
+
+ /*
+ * Do the translations. The first pointer follows the field count
+ * field. The field count field is the size of a pointer.
+ */
+ tOptDesc* pOD = genshelloptOptions.pOptDesc;
+ char** ppz = (char**)(void*)&(option_usage_text);
+ int ix = option_usage_text.field_ct;
do {
ppz++;
*ppz = AO_gettext(*ppz);
} while (--ix > 0);
+
+ COERSION(pzCopyright);
+ COERSION(pzCopyNotice);
+ COERSION(pzFullVersion);
+ COERSION(pzUsageTitle);
+ COERSION(pzExplain);
+ COERSION(pzDetail);
+ option_usage_text.field_ct = 0;
+
+ for (ix = genshelloptOptions.optCt; ix > 0; ix--, pOD++)
+ coerce_it((void*)&(pOD->pzText));
}
- option_usage_text.field_ct = 0;
- {
+ if ((genshelloptOptions.fOptSet & OPTPROC_NXLAT_OPT_CFG) == 0) {
tOptDesc* pOD = genshelloptOptions.pOptDesc;
- int ix = genshelloptOptions.optCt;
-
- for (;;) {
- pOD->pzText = AO_gettext(pOD->pzText);
- pOD->pz_NAME = AO_gettext(pOD->pz_NAME);
- pOD->pz_Name = AO_gettext(pOD->pz_Name);
- pOD->pz_DisableName = AO_gettext(pOD->pz_DisableName);
- pOD->pz_DisablePfx = AO_gettext(pOD->pz_DisablePfx);
- if (--ix <= 0)
- break;
- pOD++;
+ int ix;
+
+ for (ix = genshelloptOptions.optCt; ix > 0; ix--, pOD++) {
+ coerce_it((void*)&(pOD->pz_Name));
+ coerce_it((void*)&(pOD->pz_DisableName));
+ coerce_it((void*)&(pOD->pz_DisablePfx));
}
+ /* prevent re-translation */
+ genshelloptOptions.fOptSet |= OPTPROC_NXLAT_OPT_CFG | OPTPROC_NXLAT_OPT;
}
- COERSION(pzCopyright);
- COERSION(pzCopyNotice);
- COERSION(pzFullVersion);
- COERSION(pzUsageTitle);
- COERSION(pzExplain);
- COERSION(pzDetail);
}
#endif /* ENABLE_NLS */
*
* DO NOT EDIT THIS FILE (genshell.h)
*
- * It has been AutoGen-ed Saturday May 5, 2007 at 12:02:35 PM PDT
+ * It has been AutoGen-ed Saturday May 16, 2009 at 08:15:54 AM PDT
* From the definitions genshell.def
* and the template file options
*
- * Generated from AutoOpts 29:0:4 templates.
+ * Generated from AutoOpts @AO_CURRENT@:@AO_REVISION@:@AO_AGE@ templates.
*/
/*
*
* This source file is copyrighted and licensed under the following terms:
*
- * genshellopt copyright 1999-2007 Bruce Korb - all rights reserved
+ * genshellopt copyright 1999-2009 Bruce Korb - all rights reserved
*
- * genshellopt is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
+ * genshellopt 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.
*
- * genshellopt 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
- * Lesser General Public License for more details.
+ * genshellopt 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 Lesser General Public
- * License along with genshellopt. If not, write to:
- * The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301, USA.
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* This file contains the programmatic interface to the Automated
* "AutoOpts" chapter. Please refer to that doc for usage help.
*/
#ifndef AUTOOPTS_GENSHELL_H_GUARD
-#define AUTOOPTS_GENSHELL_H_GUARD
+#define AUTOOPTS_GENSHELL_H_GUARD 1
#include <autoopts/options.h>
/*
* tolerable version is at least as old as what was current when the header
* template was released.
*/
-#define AO_TEMPLATE_VERSION 118784
+#define AO_TEMPLATE_VERSION 131073
#if (AO_TEMPLATE_VERSION < OPTIONS_MINIMUM_VERSION) \
|| (AO_TEMPLATE_VERSION > OPTIONS_STRUCT_VERSION)
# error option template version mismatches autoopts/options.h header
* Enumeration of each option:
*/
typedef enum {
- INDEX_OPT_SCRIPT = 0,
- INDEX_OPT_SHELL = 1,
- INDEX_OPT_VERSION = 2,
- INDEX_OPT_HELP = 3,
- INDEX_OPT_MORE_HELP = 4
+ INDEX_OPT_SCRIPT = 0,
+ INDEX_OPT_SHELL = 1,
+ INDEX_OPT_VERSION = 2,
+ INDEX_OPT_HELP = 3,
+ INDEX_OPT_MORE_HELP = 4
} teOptIndex;
#define OPTION_CT 5
DESC(n).fOptState |= OPTST_DISABLED; \
DESC(n).optCookie = NULL )
-/*
+/* * * * * *
+ *
* Interface defines for specific options.
*/
#define VALUE_OPT_SCRIPT 'o'
#define VALUE_OPT_SHELL 's'
-
-#define VALUE_OPT_VERSION 'v'
#define VALUE_OPT_HELP '?'
#define VALUE_OPT_MORE_HELP '!'
+#define VALUE_OPT_VERSION 'v'
/*
* Interface defines not associated with particular options
*/
genshelloptOptions.pzCurOpt = NULL )
#define START_OPT RESTART_OPT(1)
#define USAGE(c) (*genshelloptOptions.pUsageProc)( &genshelloptOptions, c )
-/* extracted from opthead.tpl near line 360 */
+/* extracted from opthead.tpl near line 409 */
/* * * * * *
*
extern tOptions genshelloptOptions;
-#ifndef _
-# if ENABLE_NLS
-# include <stdio.h>
- static inline char* aoGetsText( char const* pz ) {
- if (pz == NULL) return NULL;
- return (char*)gettext( pz );
- }
-# define _(s) aoGetsText(s)
-# else /* ENABLE_NLS */
-# define _(s) s
-# endif /* ENABLE_NLS */
-#endif
+#if defined(ENABLE_NLS)
+# ifndef _
+# include <stdio.h>
+ static inline char* aoGetsText( char const* pz ) {
+ if (pz == NULL) return NULL;
+ return (char*)gettext( pz );
+ }
+# define _(s) aoGetsText(s)
+# endif /* _() */
+
+# define OPT_NO_XLAT_CFG_NAMES STMTS(genshelloptOptions.fOptSet |= \
+ OPTPROC_NXLAT_OPT_CFG;)
+# define OPT_NO_XLAT_OPT_NAMES STMTS(genshelloptOptions.fOptSet |= \
+ OPTPROC_NXLAT_OPT|OPTPROC_NXLAT_OPT_CFG;)
+
+# define OPT_XLAT_CFG_NAMES STMTS(genshelloptOptions.fOptSet &= \
+ ~(OPTPROC_NXLAT_OPT|OPTPROC_NXLAT_OPT_CFG);)
+# define OPT_XLAT_OPT_NAMES STMTS(genshelloptOptions.fOptSet &= \
+ ~OPTPROC_NXLAT_OPT;)
+
+#else /* ENABLE_NLS */
+# define OPT_NO_XLAT_CFG_NAMES
+# define OPT_NO_XLAT_OPT_NAMES
+
+# define OPT_XLAT_CFG_NAMES
+# define OPT_XLAT_OPT_NAMES
+
+# ifndef _
+# define _(_s) _s
+# endif
+#endif /* ENABLE_NLS */
#ifdef __cplusplus
}
#include "autoopts/options.h"
#include "autoopts/usage-txt.h"
#include "genshell.h"
+#include "xat-attribute.h"
+#include "value-type.h"
+#include "ag-char-map.h"
#include "autoopts.h"
#include "proto.h"
+#include "value-type.c"
+#include "xat-attribute.c"
#include "autoopts.c"
#include "boolean.c"
#include "configfile.c"
#include "cook.c"
#include "enumeration.c"
#include "environment.c"
+#include "file.c"
#include "genshell.c"
#include "load.c"
#include "makeshell.c"
#include "numeric.c"
#include "pgusage.c"
#include "putshell.c"
+#include "reset.c"
#include "restore.c"
#include "save.c"
#include "sort.c"
#include "streqvcmp.c"
#include "text_mmap.c"
#include "tokenize.c"
+#include "time.c"
#include "usage.c"
#include "version.c"
/*
- * $Id: load.c,v 4.20 2007/02/04 22:17:39 bkorb Exp $
- * Time-stamp: "2007-02-04 11:54:57 bkorb"
+ * $Id: load.c,v 4.28 2009/01/01 16:51:48 bkorb Exp $
+ * Time-stamp: "2008-12-06 10:16:05 bkorb"
*
* This file contains the routines that deal with processing text strings
* for options, either from a NUL-terminated string passed in or from an
* rc/ini file.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
+ * These files have the following md5sums:
*
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
tOptionLoadMode option_load_mode = OPTION_LOAD_UNCOOKED;
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static ag_bool
insertProgramPath(
char* pzBuf,
* ret-desc: AG_TRUE if the name was handled, otherwise AG_FALSE.
* If the name does not start with ``$'', then it is handled
* simply by copying the input name to the output buffer and
- * resolving the name with either @code{canonicalize_file_name(3GLIBC)}
- * or @code{realpath(3C)}.
+ * resolving the name with either
+ * @code{canonicalize_file_name(3GLIBC)} or @code{realpath(3C)}.
*
* doc:
*
* allocated and we need to deallocate it.
*/
if (pzPath != pzProgPath)
- free( (void*)pzPath );
+ AGFREE(pzPath);
return AG_TRUE;
}
for (;;) {
int ch = (int)*++pzName;
- if (! ISNAMECHAR( ch ))
+ if (! IS_VALUE_NAME_CHAR(ch))
break;
*(pzDir++) = (char)ch;
}
if (mode == OPTION_LOAD_KEEP)
return;
- if (isspace( (int)*pzTxt )) {
+ if (IS_WHITESPACE_CHAR(*pzTxt)) {
char* pzS = pzTxt;
char* pzD = pzTxt;
- while (isspace( (int)*++pzS )) ;
+ while (IS_WHITESPACE_CHAR(*++pzS)) ;
while ((*(pzD++) = *(pzS++)) != NUL) ;
pzE = pzD-1;
} else
pzE = pzTxt + strlen( pzTxt );
- while ((pzE > pzTxt) && isspace( (int)pzE[-1] )) pzE--;
+ while ((pzE > pzTxt) && IS_WHITESPACE_CHAR(pzE[-1])) pzE--;
*pzE = NUL;
if (mode == OPTION_LOAD_UNCOOKED)
static char*
assembleArgValue( char* pzTxt, tOptionLoadMode mode )
{
- tSCC zBrk[] = " \t:=";
+ tSCC zBrk[] = " \t\n:=";
char* pzEnd = strpbrk( pzTxt, zBrk );
int space_break;
* because we'll have to skip over an immediately following ':' or '='
* (and the white space following *that*).
*/
- space_break = isspace((int)*pzEnd);
+ space_break = IS_WHITESPACE_CHAR(*pzEnd);
*(pzEnd++) = NUL;
- while (isspace((int)*pzEnd)) pzEnd++;
+ while (IS_WHITESPACE_CHAR(*pzEnd)) pzEnd++;
if (space_break && ((*pzEnd == ':') || (*pzEnd == '=')))
- while (isspace((int)*++pzEnd)) ;
+ while (IS_WHITESPACE_CHAR(*++pzEnd)) ;
return pzEnd;
}
tDirection direction,
tOptionLoadMode load_mode )
{
- while (isspace( (int)*pzLine )) pzLine++;
+ while (IS_WHITESPACE_CHAR(*pzLine)) pzLine++;
{
char* pzArg = assembleArgValue( pzLine, load_mode );
dnl
dnl DO NOT EDIT THIS FILE (libopts.m4)
dnl
-dnl It has been AutoGen-ed Saturday May 5, 2007 at 12:02:37 PM PDT
+dnl It has been AutoGen-ed Saturday May 16, 2009 at 08:15:55 AM PDT
dnl From the definitions libopts.def
dnl and the template file conftest.tpl
dnl
AC_MSG_ERROR([You must have one of limits.h, sys/limits.h or values.h])
fi
+ # ----------------------------------------------------------------------
+ # check for various programs used during the build.
+ # On OS/X, "wchar.h" needs "runetype.h" to work properly.
+ # ----------------------------------------------------------------------
+ AC_CHECK_HEADERS([runetype.h wchar.h], [], [],[
+ AC_INCLUDES_DEFAULT
+ #if HAVE_RUNETYPE_H
+ # include <runetype.h>
+ #endif
+ ])
+
+ # ----------------------------------------------------------------------
+ # Checks for typedefs
+ # ----------------------------------------------------------------------
+ AC_CHECK_TYPES(wchar_t)
+ AC_CHECK_TYPES(wint_t, [], [], [
+ AC_INCLUDES_DEFAULT
+ #if HAVE_RUNETYPE_H
+ # include <runetype.h>
+ #endif
+ #if HAVE_WCHAR_H
+ # include <wchar.h>
+ #endif
+ ])
+
# ========================
# ...and int types headers
# ========================
AC_CHECK_HEADERS(stdint.h inttypes.h, break)
AC_CHECK_TYPES([int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t,
- intptr_t, uint_t])
+ intptr_t, uintptr_t, uint_t, pid_t, size_t])
- # ====================
- # uintptr type & sizes
- # ====================
- AC_CHECK_TYPES([uintptr_t], ,
- [AC_DEFINE([uintptr_t], unsigned long,
- [Alternate uintptr_t for systems without it.])])
+ # =====
+ # sizes
+ # =====
AC_CHECK_SIZEOF(char*, 4)
AC_CHECK_SIZEOF(int, 4)
AC_CHECK_SIZEOF(long, 4)
# ----------------------------------------------------------------------
AC_CHECK_LIB(gen, pathfind)
AC_FUNC_VPRINTF
- AC_CHECK_FUNCS([mmap canonicalize_file_name snprintf strdup strchr strrchr])
+ AC_CHECK_FUNCS([mmap canonicalize_file_name snprintf strdup strchr \
+ strrchr strsignal])
[ INVOKE_LIBOPTS_MACROS_FIRST_done=yes
fi]])
dnl @synopsis LIBOPTS_CHECK
dnl
-dnl Time-stamp: "2006-09-23 19:36:24 bkorb"
-dnl Last Committed: $Date: 2006/09/24 02:59:00 $
+dnl Time-stamp: "2007-07-04 11:41:40 bkorb"
+dnl Last Committed: $Date: 2007/07/04 20:51:20 $
dnl
dnl If autoopts-config works, add the linking information to LIBS.
dnl Otherwise, add ``libopts-${ao_rev}'' to SUBDIRS and run all
dnl the config tests that the library needs. Invoke the
dnl "INVOKE_LIBOPTS_MACROS" macro iff we are building libopts.
dnl
+dnl This file is part of AutoGen.
+dnl AutoGen copyright (c) 1992-2007 Bruce Korb - all rights reserved
+dnl
+dnl AutoGen is free software: you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation, either version 3 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl AutoGen is distributed in the hope that it will be useful, but
+dnl WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+dnl See the GNU General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License along
+dnl with this program. If not, see <http://www.gnu.org/licenses/>.
+dnl
dnl Default to system libopts
dnl
AC_DEFUN([LIBOPTS_CHECK],[
# liboptschk.m4 serial 1 (autogen - 5.7.3)
-dnl Copyright (C) 2005 Free Software Foundation, Inc.
+dnl copyright (c) 2005 by Bruce Korb - all rights reserved
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
dnl Time-stamp: "2006-09-23 19:42:31 bkorb"
-dnl Last Committed: $Date: 2006/09/24 02:59:00 $
+dnl Last Committed: $Date: 2007/07/04 20:51:18 $
dnl This file can can be used in projects which are not available under
dnl the GNU General Public License or the GNU Library General Public
/*
- * $Id: makeshell.c,v 4.20 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2007-01-27 06:05:45 bkorb"
+ * $Id: makeshell.c,v 4.28 2009/01/01 16:51:48 bkorb Exp $
+ * Time-stamp: "2008-07-26 16:10:51 bkorb"
*
* This module will interpret the options set in the tOptions
* structure and create a Bourne shell script capable of parsing them.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
+ * These files have the following md5sums:
*
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
tOptions* pShellParseOptions = NULL;
static char* pzTrailer = NULL;
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static void
textToVariable( tOptions* pOpts, teTextTo whichVar, tOptDesc* pOD );
*/
switch (OPTST_GET_ARGTYPE(pOptDesc->fOptState)) {
case OPARG_TYPE_ENUMERATION:
- (*(pOptDesc->pOptProc))( (tOptions*)2UL, pOptDesc );
+ (*(pOptDesc->pOptProc))(OPTPROC_EMIT_SHELL, pOptDesc );
pzDefault = pOptDesc->optArg.argString;
break;
if (SKIP_OPT(pOptDesc))
continue;
- if (isprint( pOptDesc->optValue )) {
+ if (IS_GRAPHIC_CHAR(pOptDesc->optValue)) {
printf( zOptionFlag, pOptDesc->optValue );
printOptionAction( pOpts, pOptDesc );
}
/*
- * $Id: nested.c,v 4.14 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2007-01-26 11:04:35 bkorb"
+ * $Id: nested.c,v 4.27 2009/01/01 16:51:48 bkorb Exp $
+ * Time-stamp: "2008-07-28 19:18:28 bkorb"
*
* Automated Options Nested Values module.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
+ * These files have the following md5sums:
*
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
+
+typedef struct {
+ int xml_ch;
+ int xml_len;
+ char xml_txt[8];
+} xml_xlate_t;
+
+static xml_xlate_t const xml_xlate[] = {
+ { '&', 4, "amp;" },
+ { '<', 3, "lt;" },
+ { '>', 3, "gt;" },
+ { '"', 5, "quot;" },
+ { '\'',5, "apos;" }
+};
+
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static void
-removeBackslashes( char* pzSrc );
+removeLineContinue( char* pzSrc );
static char const*
scanQuotedString( char const* pzTxt );
sortNestedList( tArgList* pAL );
/* = = = END-STATIC-FORWARD = = = */
-/* removeBackslashes
+/* removeLineContinue
*
- * This function assumes that all newline characters were preceeded by
- * backslashes that need removal.
+ * Backslashes are used for line continuations. We keep the newline
+ * characters, but trim out the backslash:
*/
static void
-removeBackslashes( char* pzSrc )
+removeLineContinue( char* pzSrc )
{
- char* pzD = strchr(pzSrc, '\n');
+ char* pzD;
- if (pzD == NULL)
- return;
- *--pzD = '\n';
+ do {
+ while (*pzSrc == '\n') pzSrc++;
+ pzD = strchr(pzSrc, '\n');
+ if (pzD == NULL)
+ return;
+ /*
+ * pzD has skipped at least one non-newline character and now
+ * points to a newline character. It now becomes the source and
+ * pzD goes to the previous character.
+ */
+ pzSrc = pzD--;
+ if (*pzD != '\\')
+ pzD++;
+ } while (pzD == pzSrc);
+
+ /*
+ * Start shifting text.
+ */
for (;;) {
char ch = ((*pzD++) = *(pzSrc++));
switch (ch) {
- case '\n': *--pzD = ch; break;
case NUL: return;
- default:
- ;
+ case '\\':
+ if (*pzSrc == '\n')
+ --pzD; /* rewrite on next iteration */
}
}
}
} else {
pNV->valType = OPARG_TYPE_STRING;
- if (dataLen > 0)
- memcpy( pNV->v.strVal, pzValue, dataLen );
- pNV->v.strVal[dataLen] = NUL;
+ if (dataLen > 0) {
+ char const * pzSrc = pzValue;
+ char * pzDst = pNV->v.strVal;
+ int ct = dataLen;
+ do {
+ int ch = *(pzSrc++) & 0xFF;
+ if (ch == NUL) goto data_copy_done;
+ if (ch == '&')
+ ch = get_special_char(&pzSrc, &ct);
+ *(pzDst++) = ch;
+ } while (--ct > 0);
+ data_copy_done:
+ *pzDst = NUL;
+
+ } else {
+ pNV->v.strVal[0] = NUL;
+ }
+
pNV->pzName = pNV->v.strVal + dataLen + 1;
}
pNV = AGALOC( sz, "option name/bool value pair" );
if (pNV == NULL)
return NULL;
- while (isspace( (int)*pzValue ) && (dataLen > 0)) {
+ while (IS_WHITESPACE_CHAR(*pzValue) && (dataLen > 0)) {
dataLen--; pzValue++;
}
if (dataLen == 0)
pNV->v.boolVal = 0;
- else if (isdigit( (int)*pzValue ))
- pNV->v.boolVal = atoi( pzValue );
- else switch (*pzValue) {
- case 'f':
- case 'F':
- case 'n':
- case 'N':
- pNV->v.boolVal = 0; break;
- default:
- pNV->v.boolVal = 1;
- }
+
+ else if (IS_DEC_DIGIT_CHAR(*pzValue))
+ pNV->v.boolVal = atoi(pzValue);
+
+ else pNV->v.boolVal = ! IS_FALSE_TYPE_CHAR(*pzValue);
pNV->valType = OPARG_TYPE_BOOLEAN;
pNV->pzName = (char*)(pNV + 1);
pNV = AGALOC( sz, "option name/bool value pair" );
if (pNV == NULL)
return NULL;
- while (isspace( (int)*pzValue ) && (dataLen > 0)) {
+ while (IS_WHITESPACE_CHAR(*pzValue) && (dataLen > 0)) {
dataLen--; pzValue++;
}
if (dataLen == 0)
- pNV->v.boolVal = 0;
+ pNV->v.longVal = 0;
else
- pNV->v.boolVal = atoi( pzValue );
+ pNV->v.longVal = strtol(pzValue, 0, 0);
pNV->valType = OPARG_TYPE_NUMERIC;
- pNV->pzName = (char*)(pNV + 1);
+ pNV->pzName = (char*)(pNV + 1);
memcpy( pNV->pzName, pzName, nameLen );
pNV->pzName[ nameLen ] = NUL;
addArgListEntry( pp, pNV );
scanNameEntry(char const* pzName, tOptionValue* pRes)
{
tOptionValue* pNV;
- char const * pzScan = pzName+1;
+ char const * pzScan = pzName+1; /* we know first char is a name char */
char const * pzVal;
size_t nameLen = 1;
size_t dataLen = 0;
- while (ISNAMECHAR( (int)*pzScan )) { pzScan++; nameLen++; }
-
- while (isspace( (int)*pzScan )) {
- char ch = *(pzScan++);
- if ((ch == '\n') || (ch == ',')) {
- addStringValue(&(pRes->v.nestVal), pzName, nameLen, NULL,(size_t)0);
- return pzScan - 1;
- }
- }
+ /*
+ * Scan over characters that name a value. These names may not end
+ * with a colon, but they may contain colons.
+ */
+ while (IS_VALUE_NAME_CHAR(*pzScan)) { pzScan++; nameLen++; }
+ if (pzScan[-1] == ':') { pzScan--; nameLen--; }
+ while (IS_HORIZ_WHITE_CHAR(*pzScan)) pzScan++;
+re_switch:
switch (*pzScan) {
case '=':
case ':':
- while (isspace( (int)*++pzScan )) ;
- switch (*pzScan) {
- case ',': goto comma_char;
- case '"':
- case '\'': goto quote_char;
- case NUL: goto nul_byte;
- default: goto default_char;
- }
+ while (IS_HORIZ_WHITE_CHAR( (int)*++pzScan )) ;
+ if ((*pzScan == '=') || (*pzScan == ':'))
+ goto default_char;
+ goto re_switch;
+ case '\n':
case ',':
- comma_char:
pzScan++;
/* FALLTHROUGH */
case NUL:
- nul_byte:
addStringValue(&(pRes->v.nestVal), pzName, nameLen, NULL, (size_t)0);
break;
case '"':
case '\'':
- quote_char:
pzVal = pzScan;
pzScan = scanQuotedString( pzScan );
dataLen = pzScan - pzVal;
pNV = addStringValue( &(pRes->v.nestVal), pzName, nameLen,
pzVal, dataLen );
if (pNV != NULL)
- removeBackslashes( pNV->v.strVal );
+ removeLineContinue( pNV->v.strVal );
goto leave_scan_name;
}
}
tOptionValue* pNewVal;
tOptionLoadMode save_mode = option_load_mode;
- if (! isalpha((int)*pzName)) {
+ if (! IS_VAR_FIRST_CHAR(*pzName)) {
switch (*pzName) {
default:
pzName = NULL;
return pzName;
}
- while (isalpha( (int)*++pzScan )) nameLen++;
+ pzScan++;
+ while (IS_VALUE_NAME_CHAR( (int)*pzScan )) { pzScan++; nameLen++; }
if (nameLen > 64)
return NULL;
valu.valType = OPARG_TYPE_STRING;
}
addStringValue(&(pRes->v.nestVal), pzName, nameLen, NULL, (size_t)0);
option_load_mode = save_mode;
- return pzScan+2;
+ return pzScan+1;
default:
option_load_mode = save_mode;
}
valLen = (pzScan - pzVal);
pzScan += nameLen + 3;
- while (isspace( (int)*pzScan )) pzScan++;
+ while (IS_WHITESPACE_CHAR(*pzScan)) pzScan++;
}
switch (valu.valType) {
errno = EINVAL;
return NULL;
}
- while (isspace( (int)*pzTxt )) pzTxt++;
+ while (IS_WHITESPACE_CHAR(*pzTxt)) pzTxt++;
if (*pzTxt == NUL) {
errno = ENOENT;
return NULL;
* Scan until we hit a NUL.
*/
do {
- while (isspace( (int)*pzTxt )) pzTxt++;
- if (isalpha( (int)*pzTxt )) {
+ while (IS_WHITESPACE_CHAR( (int)*pzTxt )) pzTxt++;
+ if (IS_VAR_FIRST_CHAR( (int)*pzTxt )) {
pzTxt = scanNameEntry( pzTxt, pRes );
}
else switch (*pzTxt) {
case NUL: goto scan_done;
case '<': pzTxt = scanXmlEntry( pzTxt, pRes );
+ if (pzTxt == NULL) goto woops;
if (*pzTxt == ',') pzTxt++; break;
case '#': pzTxt = strchr( pzTxt, '\n' ); break;
default: goto woops;
* Nested value was found on the command line
=*/
void
-optionNestedVal( tOptions* pOpts, tOptDesc* pOD )
+optionNestedVal(tOptions* pOpts, tOptDesc* pOD)
{
- tOptionValue* pOV = optionLoadNested(
- pOD->optArg.argString, pOD->pz_Name, strlen(pOD->pz_Name));
+ if (pOpts < OPTPROC_EMIT_LIMIT)
+ return;
+
+ if (pOD->fOptState & OPTST_RESET) {
+ tArgList* pAL = pOD->optCookie;
+ int ct;
+ tCC ** av;
+
+ if (pAL == NULL)
+ return;
+ ct = pAL->useCt;
+ av = pAL->apzArgs;
+
+ while (--ct >= 0) {
+ void * p = (void *)*(av++);
+ optionUnloadNested((tOptionValue const *)p);
+ }
+
+ AGFREE(pOD->optCookie);
- if (pOV != NULL)
- addArgListEntry( &(pOD->optCookie), (void*)pOV );
+ } else {
+ tOptionValue* pOV = optionLoadNested(
+ pOD->optArg.argString, pOD->pz_Name, strlen(pOD->pz_Name));
+
+ if (pOV != NULL)
+ addArgListEntry( &(pOD->optCookie), (void*)pOV );
+ }
}
+
+
+/*
+ * get_special_char
+ */
+LOCAL int
+get_special_char(char const ** ppz, int * ct)
+{
+ char const * pz = *ppz;
+
+ if (*ct < 3)
+ return '&';
+
+ if (*pz == '#') {
+ int base = 10;
+ int retch;
+
+ pz++;
+ if (*pz == 'x') {
+ base = 16;
+ pz++;
+ }
+ retch = (int)strtoul(pz, (char **)&pz, base);
+ if (*pz != ';')
+ return '&';
+ base = ++pz - *ppz;
+ if (base > *ct)
+ return '&';
+
+ *ct -= base;
+ *ppz = pz;
+ return retch;
+ }
+
+ {
+ int ctr = sizeof(xml_xlate) / sizeof(xml_xlate[0]);
+ xml_xlate_t const * xlatp = xml_xlate;
+
+ for (;;) {
+ if ( (*ct >= xlatp->xml_len)
+ && (strncmp(pz, xlatp->xml_txt, xlatp->xml_len) == 0)) {
+ *ppz += xlatp->xml_len;
+ *ct -= xlatp->xml_len;
+ return xlatp->xml_ch;
+ }
+
+ if (--ctr <= 0)
+ break;
+ xlatp++;
+ }
+ }
+ return '&';
+}
+
+
+/*
+ * emit_special_char
+ */
+LOCAL void
+emit_special_char(FILE * fp, int ch)
+{
+ int ctr = sizeof(xml_xlate) / sizeof(xml_xlate[0]);
+ xml_xlate_t const * xlatp = xml_xlate;
+
+ putc('&', fp);
+ for (;;) {
+ if (ch == xlatp->xml_ch) {
+ fputs(xlatp->xml_txt, fp);
+ return;
+ }
+ if (--ctr <= 0)
+ break;
+ xlatp++;
+ }
+ fprintf(fp, "#x%02X;", (ch & 0xFF));
+}
+
/*
* Local Variables:
* mode: C
/*
- * $Id: numeric.c,v 4.11 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2007-01-13 10:28:20 bkorb"
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
+ * $Id: numeric.c,v 4.21 2009/01/17 22:08:07 bkorb Exp $
+ * Time-stamp: "2009-01-11 18:05:28 bkorb"
*
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * Automated Options 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.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * These files have the following md5sums:
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
+ */
+
+/*=export_func optionShowRange
+ * private:
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
+ * what:
+ * arg: + tOptions* + pOpts + program options descriptor +
+ * arg: + tOptDesc* + pOptDesc + the descriptor for this arg +
+ * arg: + void * + rng_table + the value range tables +
+ * arg: + int + rng_count + the number of entries +
*
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
- */
+ * doc:
+ * Show information about a numeric option with range constraints.
+=*/
+void
+optionShowRange(tOptions* pOpts, tOptDesc* pOD, void * rng_table, int rng_ct)
+{
+ static char const bullet[] = "\t\t\t\t- ";
+ static char const deepin[] = "\t\t\t\t ";
+ static char const onetab[] = "\t";
+
+ const struct {long const rmin, rmax;} * rng = rng_table;
+
+ char const * pz_indent =
+ (pOpts != OPTPROC_EMIT_USAGE) ? onetab : bullet;
+
+ if ((pOpts == OPTPROC_EMIT_USAGE) || (pOpts > OPTPROC_EMIT_LIMIT)) {
+ char const * lie_in_range = zRangeLie;
+
+ if (pOpts > OPTPROC_EMIT_LIMIT) {
+ fprintf(option_usage_fp, zRangeErr,
+ pOpts->pzProgName, pOD->pz_Name, pOD->optArg.argString);
+ fprintf(option_usage_fp, "The %s option:\n", pOD->pz_Name);
+ lie_in_range = zRangeBadLie;
+ pz_indent = "";
+ }
+
+ if (pOD->fOptState & OPTST_SCALED_NUM)
+ fprintf(option_usage_fp, zRangeScaled, pz_indent);
+
+ if (rng_ct > 1) {
+ fprintf(option_usage_fp, lie_in_range, pz_indent);
+ pz_indent =
+ (pOpts != OPTPROC_EMIT_USAGE) ? onetab : deepin;
+
+ } else {
+ fprintf(option_usage_fp, zRangeOnly, pz_indent);
+ pz_indent = onetab + 1; /* empty string */
+ }
+
+ for (;;) {
+ if (rng->rmax == LONG_MIN)
+ fprintf(option_usage_fp, zRangeExact, pz_indent, rng->rmin);
+ else if (rng->rmin == LONG_MIN)
+ fprintf(option_usage_fp, zRangeUpto, pz_indent, rng->rmax);
+ else if (rng->rmax == LONG_MAX)
+ fprintf(option_usage_fp, zRangeAbove, pz_indent, rng->rmin);
+ else
+ fprintf(option_usage_fp, zRange, pz_indent, rng->rmin,
+ rng->rmax);
+
+ if (--rng_ct <= 0) {
+ fputc('\n', option_usage_fp);
+ break;
+ }
+ fputs(zRangeOr, option_usage_fp);
+ rng++;
+ pz_indent =
+ (pOpts != OPTPROC_EMIT_USAGE) ? onetab : deepin;
+ }
+
+ if (pOpts > OPTPROC_EMIT_LIMIT)
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ }
+}
+
/*=export_func optionNumericVal
* private:
*
- * what: Decipher a boolean value
+ * what: process an option with a numeric value.
* arg: + tOptions* + pOpts + program options descriptor +
* arg: + tOptDesc* + pOptDesc + the descriptor for this arg +
*
* Decipher a numeric value.
=*/
void
-optionNumericVal( tOptions* pOpts, tOptDesc* pOD )
+optionNumericVal(tOptions* pOpts, tOptDesc* pOD )
{
char* pz;
long val;
+ if ((pOD->fOptState & OPTST_RESET) != 0)
+ return;
+
/*
* Numeric options may have a range associated with it.
* If it does, the usage procedure requests that it be
if ((pOD == NULL) || (pOD->optArg.argString == NULL))
return;
- val = strtol( pOD->optArg.argString, &pz, 0 );
- if (*pz != NUL) {
- fprintf( stderr, zNotNumber, pOpts->pzProgName, pOD->optArg.argString );
- (*(pOpts->pUsageProc))(pOpts, EXIT_FAILURE);
- }
+ errno = 0;
+ val = strtol(pOD->optArg.argString, &pz, 0);
+ if ((pz == pOD->optArg.argString) || (errno != 0))
+ goto bad_number;
+
+ if ((pOD->fOptState & OPTST_SCALED_NUM) != 0)
+ switch (*(pz++)) {
+ case '\0': pz--; break;
+ case 't': val *= 1000;
+ case 'g': val *= 1000;
+ case 'm': val *= 1000;
+ case 'k': val *= 1000; break;
+
+ case 'T': val *= 1024;
+ case 'G': val *= 1024;
+ case 'M': val *= 1024;
+ case 'K': val *= 1024; break;
+
+ default: goto bad_number;
+ }
+
+ if (*pz != NUL)
+ goto bad_number;
if (pOD->fOptState & OPTST_ALLOC_ARG) {
AGFREE(pOD->optArg.argString);
}
pOD->optArg.argInt = val;
+ return;
+
+bad_number:
+ fprintf( stderr, zNotNumber, pOpts->pzProgName, pOD->optArg.argString );
+ if ((pOpts->fOptSet & OPTPROC_ERRSTOP) != 0)
+ (*(pOpts->pUsageProc))(pOpts, EXIT_FAILURE);
+
+ pOD->optArg.argInt = ~0;
}
+
/*
* Local Variables:
* mode: C
--- /dev/null
+/* Parse a time duration and return a seconds count
+ Copyright (C) 2008 Free Software Foundation, Inc.
+ Written by Bruce Korb <bkorb@gnu.org>, 2008.
+
+ 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 <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "parse-duration.h"
+
+#ifndef _
+#define _(_s) _s
+#endif
+
+#ifndef NUL
+#define NUL '\0'
+#endif
+
+#define cch_t char const
+
+typedef enum {
+ NOTHING_IS_DONE,
+ YEAR_IS_DONE,
+ MONTH_IS_DONE,
+ WEEK_IS_DONE,
+ DAY_IS_DONE,
+ HOUR_IS_DONE,
+ MINUTE_IS_DONE,
+ SECOND_IS_DONE
+} whats_done_t;
+
+#define SEC_PER_MIN 60
+#define SEC_PER_HR (SEC_PER_MIN * 60)
+#define SEC_PER_DAY (SEC_PER_HR * 24)
+#define SEC_PER_WEEK (SEC_PER_DAY * 7)
+#define SEC_PER_MONTH (SEC_PER_DAY * 30)
+#define SEC_PER_YEAR (SEC_PER_DAY * 365)
+
+#define TIME_MAX 0x7FFFFFFF
+
+static unsigned long inline
+str_const_to_ul (cch_t * str, cch_t ** ppz, int base)
+{
+ return strtoul (str, (char **)ppz, base);
+}
+
+static long inline
+str_const_to_l (cch_t * str, cch_t ** ppz, int base)
+{
+ return strtol (str, (char **)ppz, base);
+}
+
+static time_t inline
+scale_n_add (time_t base, time_t val, int scale)
+{
+ if (base == BAD_TIME)
+ {
+ if (errno == 0)
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ if (val > TIME_MAX / scale)
+ {
+ errno = ERANGE;
+ return BAD_TIME;
+ }
+
+ val *= scale;
+ if (base > TIME_MAX - val)
+ {
+ errno = ERANGE;
+ return BAD_TIME;
+ }
+
+ return base + val;
+}
+
+static time_t
+parse_hr_min_sec (time_t start, cch_t * pz)
+{
+ int lpct = 0;
+
+ errno = 0;
+
+ /* For as long as our scanner pointer points to a colon *AND*
+ we've not looped before, then keep looping. (two iterations max) */
+ while ((*pz == ':') && (lpct++ <= 1))
+ {
+ unsigned long v = str_const_to_ul (pz+1, &pz, 10);
+
+ if (errno != 0)
+ return BAD_TIME;
+
+ start = scale_n_add (v, start, 60);
+
+ if (errno != 0)
+ return BAD_TIME;
+ }
+
+ /* allow for trailing spaces */
+ while (isspace ((unsigned char)*pz)) pz++;
+ if (*pz != NUL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ return start;
+}
+
+static time_t
+parse_scaled_value (time_t base, cch_t ** ppz, cch_t * endp, int scale)
+{
+ cch_t * pz = *ppz;
+ time_t val;
+
+ if (base == BAD_TIME)
+ return base;
+
+ errno = 0;
+ val = str_const_to_ul (pz, &pz, 10);
+ if (errno != 0)
+ return BAD_TIME;
+ while (isspace ((unsigned char)*pz)) pz++;
+ if (pz != endp)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ *ppz = pz;
+ return scale_n_add (base, val, scale);
+}
+
+static time_t
+parse_year_month_day (cch_t * pz, cch_t * ps)
+{
+ time_t res = 0;
+
+ res = parse_scaled_value (0, &pz, ps, SEC_PER_YEAR);
+
+ ps = strchr (++pz, '-');
+ if (ps == NULL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_MONTH);
+
+ pz++;
+ ps = pz + strlen (pz);
+ return parse_scaled_value (res, &pz, ps, SEC_PER_DAY);
+}
+
+static time_t
+parse_yearmonthday (cch_t * in_pz)
+{
+ time_t res = 0;
+ char buf[8];
+ cch_t * pz;
+
+ if (strlen (in_pz) != 8)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ memcpy (buf, in_pz, 4);
+ buf[4] = NUL;
+ pz = buf;
+ res = parse_scaled_value (0, &pz, buf + 4, SEC_PER_YEAR);
+
+ memcpy (buf, in_pz + 4, 2);
+ buf[2] = NUL;
+ pz = buf;
+ res = parse_scaled_value (res, &pz, buf + 2, SEC_PER_MONTH);
+
+ memcpy (buf, in_pz + 6, 2);
+ buf[2] = NUL;
+ pz = buf;
+ return parse_scaled_value (res, &pz, buf + 2, SEC_PER_DAY);
+}
+
+static time_t
+parse_YMWD (cch_t * pz)
+{
+ time_t res = 0;
+ cch_t * ps = strchr (pz, 'Y');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (0, &pz, ps, SEC_PER_YEAR);
+ pz++;
+ }
+
+ ps = strchr (pz, 'M');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_MONTH);
+ pz++;
+ }
+
+ ps = strchr (pz, 'W');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_WEEK);
+ pz++;
+ }
+
+ ps = strchr (pz, 'D');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_DAY);
+ pz++;
+ }
+
+ while (isspace ((unsigned char)*pz)) pz++;
+ if (*pz != NUL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ return res;
+}
+
+static time_t
+parse_hour_minute_second (cch_t * pz, cch_t * ps)
+{
+ time_t res = 0;
+
+ res = parse_scaled_value (0, &pz, ps, SEC_PER_HR);
+
+ ps = strchr (++pz, ':');
+ if (ps == NULL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_MIN);
+
+ pz++;
+ ps = pz + strlen (pz);
+ return parse_scaled_value (res, &pz, ps, 1);
+}
+
+static time_t
+parse_hourminutesecond (cch_t * in_pz)
+{
+ time_t res = 0;
+ char buf[4];
+ cch_t * pz;
+
+ if (strlen (in_pz) != 6)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ memcpy (buf, in_pz, 2);
+ buf[2] = NUL;
+ pz = buf;
+ res = parse_scaled_value (0, &pz, buf + 2, SEC_PER_HR);
+
+ memcpy (buf, in_pz + 2, 2);
+ buf[2] = NUL;
+ pz = buf;
+ res = parse_scaled_value (res, &pz, buf + 2, SEC_PER_MIN);
+
+ memcpy (buf, in_pz + 4, 2);
+ buf[2] = NUL;
+ pz = buf;
+ return parse_scaled_value (res, &pz, buf + 2, 1);
+}
+
+static time_t
+parse_HMS (cch_t * pz)
+{
+ time_t res = 0;
+ cch_t * ps = strchr (pz, 'H');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (0, &pz, ps, SEC_PER_HR);
+ pz++;
+ }
+
+ ps = strchr (pz, 'M');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_MIN);
+ pz++;
+ }
+
+ ps = strchr (pz, 'S');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, 1);
+ pz++;
+ }
+
+ while (isspace ((unsigned char)*pz)) pz++;
+ if (*pz != NUL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ return res;
+}
+
+static time_t
+parse_time (cch_t * pz)
+{
+ cch_t * ps;
+ time_t res = 0;
+
+ /*
+ * Scan for a hyphen
+ */
+ ps = strchr (pz, ':');
+ if (ps != NULL)
+ {
+ res = parse_hour_minute_second (pz, ps);
+ }
+
+ /*
+ * Try for a 'H', 'M' or 'S' suffix
+ */
+ else if (ps = strpbrk (pz, "HMS"),
+ ps == NULL)
+ {
+ /* Its a YYYYMMDD format: */
+ res = parse_hourminutesecond (pz);
+ }
+
+ else
+ res = parse_HMS (pz);
+
+ return res;
+}
+
+static char *
+trim(char * pz)
+{
+ /* trim leading white space */
+ while (isspace ((unsigned char)*pz)) pz++;
+
+ /* trim trailing white space */
+ {
+ char * pe = pz + strlen (pz);
+ while ((pe > pz) && isspace ((unsigned char)pe[-1])) pe--;
+ *pe = NUL;
+ }
+
+ return pz;
+}
+
+/*
+ * Parse the year/months/days of a time period
+ */
+static time_t
+parse_period (cch_t * in_pz)
+{
+ char * pz = xstrdup (in_pz);
+ char * pT = strchr (pz, 'T');
+ char * ps;
+ void * fptr = pz;
+ time_t res = 0;
+
+ if (pT != NUL)
+ {
+ *(pT++) = NUL;
+ pz = trim (pz);
+ pT = trim (pT);
+ }
+
+ /*
+ * Scan for a hyphen
+ */
+ ps = strchr (pz, '-');
+ if (ps != NULL)
+ {
+ res = parse_year_month_day (pz, ps);
+ }
+
+ /*
+ * Try for a 'Y', 'M' or 'D' suffix
+ */
+ else if (ps = strpbrk (pz, "YMWD"),
+ ps == NULL)
+ {
+ /* Its a YYYYMMDD format: */
+ res = parse_yearmonthday (pz);
+ }
+
+ else
+ res = parse_YMWD (pz);
+
+ if ((errno == 0) && (pT != NULL))
+ {
+ time_t val = parse_time (pT);
+ res = scale_n_add (res, val, 1);
+ }
+
+ free (fptr);
+ return res;
+}
+
+static time_t
+parse_non_iso8601(cch_t * pz)
+{
+ whats_done_t whatd_we_do = NOTHING_IS_DONE;
+
+ time_t res = 0;
+
+ do {
+ time_t val;
+
+ errno = 0;
+ val = str_const_to_l (pz, &pz, 10);
+ if (errno != 0)
+ goto bad_time;
+
+ /* IF we find a colon, then we're going to have a seconds value.
+ We will not loop here any more. We cannot already have parsed
+ a minute value and if we've parsed an hour value, then the result
+ value has to be less than an hour. */
+ if (*pz == ':')
+ {
+ if (whatd_we_do >= MINUTE_IS_DONE)
+ break;
+
+ val = parse_hr_min_sec (val, pz);
+
+ if ((whatd_we_do == HOUR_IS_DONE) && (val >= SEC_PER_HR))
+ break;
+
+ return scale_n_add (res, val, 1);
+ }
+
+ {
+ unsigned int mult;
+
+ /* Skip over white space following the number we just parsed. */
+ while (isspace ((unsigned char)*pz)) pz++;
+
+ switch (*pz)
+ {
+ default: goto bad_time;
+ case NUL:
+ return scale_n_add (res, val, 1);
+
+ case 'y': case 'Y':
+ if (whatd_we_do >= YEAR_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_YEAR;
+ whatd_we_do = YEAR_IS_DONE;
+ break;
+
+ case 'M':
+ if (whatd_we_do >= MONTH_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_MONTH;
+ whatd_we_do = MONTH_IS_DONE;
+ break;
+
+ case 'W':
+ if (whatd_we_do >= WEEK_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_WEEK;
+ whatd_we_do = WEEK_IS_DONE;
+ break;
+
+ case 'd': case 'D':
+ if (whatd_we_do >= DAY_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_DAY;
+ whatd_we_do = DAY_IS_DONE;
+ break;
+
+ case 'h':
+ if (whatd_we_do >= HOUR_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_HR;
+ whatd_we_do = HOUR_IS_DONE;
+ break;
+
+ case 'm':
+ if (whatd_we_do >= MINUTE_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_MIN;
+ whatd_we_do = MINUTE_IS_DONE;
+ break;
+
+ case 's':
+ mult = 1;
+ whatd_we_do = SECOND_IS_DONE;
+ break;
+ }
+
+ res = scale_n_add (res, val, mult);
+
+ while (isspace ((unsigned char)*++pz)) ;
+ if (*pz == NUL)
+ return res;
+
+ if (! isdigit ((unsigned char)*pz))
+ break;
+ }
+
+ } while (whatd_we_do < SECOND_IS_DONE);
+
+ bad_time:
+ errno = EINVAL;
+ return BAD_TIME;
+}
+
+time_t
+parse_duration (char const * pz)
+{
+ time_t res = 0;
+
+ while (isspace ((unsigned char)*pz)) pz++;
+
+ do {
+ if (*pz == 'P')
+ {
+ res = parse_period (pz + 1);
+ if ((errno != 0) || (res == BAD_TIME))
+ break;
+ return res;
+ }
+
+ if (*pz == 'T')
+ {
+ res = parse_time (pz + 1);
+ if ((errno != 0) || (res == BAD_TIME))
+ break;
+ return res;
+ }
+
+ if (! isdigit ((unsigned char)*pz))
+ break;
+
+ res = parse_non_iso8601 (pz);
+ if ((errno == 0) && (res != BAD_TIME))
+ return res;
+
+ } while (0);
+
+ fprintf (stderr, _("Invalid time duration: %s\n"), pz);
+ if (errno == 0)
+ errno = EINVAL;
+ return BAD_TIME;
+}
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-file-style: "gnu"
+ * indent-tabs-mode: nil
+ * End:
+ * end of parse-duration.c */
--- /dev/null
+/* Parse a time duration and return a seconds count
+ Copyright (C) 2008 Free Software Foundation, Inc.
+ Written by Bruce Korb <bkorb@gnu.org>, 2008.
+
+ 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 <http://www.gnu.org/licenses/>. */
+
+/*
+
+ Readers and users of this function are referred to the ISO-8601
+ specification, with particular attention to "Durations".
+
+ At the time of writing, this worked:
+
+ http://en.wikipedia.org/wiki/ISO_8601#Durations
+
+ The string must start with a 'P', 'T' or a digit.
+
+ ==== if it is a digit
+
+ the string may contain: NNN d NNN h NNN m NNN s
+ This represents NNN days, NNN hours, NNN minutes and NNN seconds.
+ The embeded white space is optional.
+ These terms must appear in this order.
+ The final "s" is optional.
+ All of the terms ("NNN" plus designator) are optional.
+ Minutes and seconds may optionally be represented as NNN:NNN.
+ Also, hours, minute and seconds may be represented as NNN:NNN:NNN.
+ There is no limitation on the value of any of the terms, except
+ that the final result must fit in a time_t value.
+
+ ==== if it is a 'P' or 'T', please see ISO-8601 for a rigorous definition.
+
+ The 'P' term may be followed by any of three formats:
+ yyyymmdd
+ yy-mm-dd
+ yy Y mm M ww W dd D
+
+ or it may be empty and followed by a 'T'. The "yyyymmdd" must be eight
+ digits long. Note: months are always 30 days and years are always 365
+ days long. 5 years is always 1825, not 1826 or 1827 depending on leap
+ year considerations. 3 months is always 90 days. There is no consideration
+ for how many days are in the current, next or previous months.
+
+ For the final format:
+ * Embedded white space is allowed, but it is optional.
+ * All of the terms are optional. Any or all-but-one may be omitted.
+ * The meanings are yy years, mm months, ww weeks and dd days.
+ * The terms must appear in this order.
+
+ ==== The 'T' term may be followed by any of these formats:
+
+ hhmmss
+ hh:mm:ss
+ hh H mm M ss S
+
+ For the final format:
+ * Embedded white space is allowed, but it is optional.
+ * All of the terms are optional. Any or all-but-one may be omitted.
+ * The terms must appear in this order.
+
+ */
+#ifndef GNULIB_PARSE_DURATION_H
+#define GNULIB_PARSE_DURATION_H
+
+#include <time.h>
+
+#define BAD_TIME ((time_t)~0)
+
+extern time_t parse_duration(char const * in_pz);
+
+#endif /* GNULIB_PARSE_DURATION_H */
/*
- * $Id: pgusage.c,v 4.12 2007/04/28 22:19:23 bkorb Exp $
- * Time-stamp: "2006-07-16 08:13:26 bkorb"
+ * $Id: pgusage.c,v 4.17 2009/01/01 16:51:49 bkorb Exp $
+ * Time-stamp: "2008-07-27 21:08:42 bkorb"
*
* Automated Options Paged Usage module.
*
* This routine will run run-on options through a pager so the
* user may examine, print or edit them at their leisure.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
*
- * Automated Options 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.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * These files have the following md5sums:
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
tePagerState pagerState = PAGER_STATE_INITIAL;
optionPagedUsage( tOptions* pOptions, tOptDesc* pOD )
{
#if defined(__windows__) && !defined(__CYGWIN__)
+ if ((pOD->fOptState & OPTST_RESET) != 0)
+ return;
+
(*pOptions->pUsageProc)( pOptions, EXIT_SUCCESS );
#else
static pid_t my_pid;
switch (pagerState) {
case PAGER_STATE_INITIAL:
{
+ if ((pOD->fOptState & OPTST_RESET) != 0)
+ return;
+
my_pid = getpid();
#ifdef HAVE_SNPRINTF
snprintf(zPageUsage, sizeof(zPageUsage), "/tmp/use.%lu", (tAoUL)my_pid);
/* -*- buffer-read-only: t -*- vi: set ro:
*
* Prototypes for autoopts
- * Generated Sat May 5 12:02:36 PDT 2007
+ * Generated Sat May 16 08:15:54 PDT 2009
*/
#ifndef AUTOOPTS_PROTO_H_GUARD
#define AUTOOPTS_PROTO_H_GUARD 1
+
#ifndef LOCAL
# define LOCAL extern
# define REDEF_LOCAL 1
#else
# undef REDEF_LOCAL
#endif
-/*\n * Extracted from autoopts.c\n */
+/*
+ * Extracted from autoopts.c
+ */
LOCAL void *
ao_malloc( size_t sz );
LOCAL tSuccess
doRegularOpts( tOptions* pOpts );
-/*\n * Extracted from configfile.c\n */
+/*
+ * Extracted from configfile.c
+ */
LOCAL void
internalFileLoad( tOptions* pOpts );
LOCAL tSuccess
validateOptionsStruct( tOptions* pOpts, char const* pzProgram );
-/*\n * Extracted from environment.c\n */
+/*
+ * Extracted from environment.c
+ */
LOCAL void
doPrognameEnv( tOptions* pOpts, teEnvPresetType type );
LOCAL void
doEnvPresets( tOptions* pOpts, teEnvPresetType type );
-/*\n * Extracted from load.c\n */
+/*
+ * Extracted from load.c
+ */
LOCAL void
mungeString( char* pzTxt, tOptionLoadMode mode );
tDirection direction,
tOptionLoadMode load_mode );
-/*\n * Extracted from nested.c\n */
+/*
+ * Extracted from nested.c
+ */
LOCAL tOptionValue*
optionLoadNested(char const* pzTxt, char const* pzName, size_t nameLen);
-/*\n * Extracted from sort.c\n */
+LOCAL int
+get_special_char(char const ** ppz, int * ct);
+
+LOCAL void
+emit_special_char(FILE * fp, int ch);
+
+/*
+ * Extracted from sort.c
+ */
LOCAL void
optionSort( tOptions* pOpts );
-/*\n * Extracted from stack.c\n */
+/*
+ * Extracted from stack.c
+ */
LOCAL void
addArgListEntry( void** ppAL, void* entry );
/*
- * $Id: putshell.c,v 4.18 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2007-01-13 10:29:39 bkorb"
+ * $Id: putshell.c,v 4.26 2009/01/01 16:51:49 bkorb Exp $
+ * Time-stamp: "2008-07-27 12:14:38 bkorb"
*
* This module will interpret the options set in the tOptions
* structure and print them to standard out in a fashion that
* will allow them to be interpreted by the Bourne or Korn shells.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
*
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * Automated Options 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.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * These files have the following md5sums:
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
- *
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static void
putQuotedStr( tCC* pzStr );
/* = = = END-STATIC-FORWARD = = = */
printf( zOptNumFmt, pOpts->pzPROGNAME, pOD->pz_NAME,
(int)(uintptr_t)(pOD->optCookie) );
pOD->optCookie = (void*)(uintptr_t)~0UL;
- (*(pOD->pOptProc))( (tOptions*)2UL, pOD );
+ (*(pOD->pOptProc))(OPTPROC_RETURN_VALNAME, pOD);
/*
* We are building the typeset list. The list returned starts with
pz = pOD->optArg.argString + 7;
while (*pz != NUL) {
printf( "typeset -x -i %s_", pOD->pz_NAME );
- pz += strspn( pz, " +\t\n\f" );
+ while (IS_PLUS_N_SPACE_CHAR(*pz)) pz++;
+
for (;;) {
- int ch = *(pz++);
- if (islower( ch )) fputc( toupper( ch ), stdout );
- else if (isalnum( ch )) fputc( ch, stdout );
- else if (isspace( ch )
- || (ch == '+')) goto name_done;
- else if (ch == NUL) { pz--; goto name_done; }
- else fputc( '_', stdout );
+ int ch = *(pz++);
+ if (IS_LOWER_CASE_CHAR(ch)) fputc(toupper(ch), stdout);
+ else if (IS_UPPER_CASE_CHAR(ch)) fputc(ch, stdout);
+ else if (IS_PLUS_N_SPACE_CHAR(ch)) goto name_done;
+ else if (ch == NUL) { pz--; goto name_done; }
+ else fputc( '_', stdout );
} name_done:;
printf( "=%1$lu # 0x%1$lX\n", (unsigned long)val );
val <<= 1;
* to emit the value corresponding to the "optArg" number.
*/
else if (OPTST_GET_ARGTYPE(pOD->fOptState) == OPARG_TYPE_ENUMERATION) {
+ uintptr_t e_val = pOD->optArg.argEnum;
printf( zOptValFmt, pOpts->pzPROGNAME, pOD->pz_NAME );
- fputc( '\'', stdout );
- (*(pOD->pOptProc))( (tOptions*)1UL, pOD );
- fputc( '\'', stdout );
- printf( zOptEnd, pOpts->pzPROGNAME, pOD->pz_NAME );
+
+ /*
+ * Convert value to string, print that and restore numeric value.
+ */
+ (*(pOD->pOptProc))(OPTPROC_RETURN_VALNAME, pOD);
+ printf("'%s'", pOD->optArg.argString);
+ if (pOD->fOptState & OPTST_ALLOC_ARG)
+ AGFREE(pOD->optArg.argString);
+ pOD->optArg.argEnum = e_val;
+
+ printf(zOptEnd, pOpts->pzPROGNAME, pOD->pz_NAME);
}
/*
--- /dev/null
+
+/*
+ * $Id: reset.c,v 4.3 2009/01/01 16:51:49 bkorb Exp $
+ * Time-stamp: "2008-08-02 12:25:18 bkorb"
+ *
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
+ *
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
+ *
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
+ *
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
+ *
+ * These files have the following md5sums:
+ *
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
+ */
+
+static void
+optionReset( tOptions* pOpts, tOptDesc* pOD )
+{
+ pOD->fOptState &= OPTST_PERSISTENT_MASK;
+ pOD->fOptState |= OPTST_RESET;
+ if (pOD->pOptProc != NULL)
+ pOD->pOptProc(pOpts, pOD);
+ pOD->optArg.argString =
+ pOpts->originalOptArgArray[ pOD->optIndex ].argString;
+ pOD->optCookie = pOpts->originalOptArgCookie[ pOD->optIndex ];
+ pOD->fOptState &= OPTST_PERSISTENT_MASK;
+}
+
+
+static void
+optionResetEverything(tOptions * pOpts)
+{
+ tOptDesc * pOD = pOpts->pOptDesc;
+ int ct = pOpts->presetOptCt;
+
+ for (;;) {
+ optionReset(pOpts, pOD);
+
+ if (--ct <= 0)
+ break;
+ pOD++;
+ }
+}
+
+
+/*=export_func optionResetOpt
+ * private:
+ *
+ * what: Reset the value of an option
+ * arg: + tOptions* + pOpts + program options descriptor +
+ * arg: + tOptDesc* + pOptDesc + the descriptor for this arg +
+ *
+ * doc:
+ * This code will cause another option to be reset to its initial state.
+ * For example, --reset=foo will cause the --foo option to be reset.
+=*/
+void
+optionResetOpt( tOptions* pOpts, tOptDesc* pOD )
+{
+ static ag_bool reset_active = AG_FALSE;
+
+ tOptState opt_state = OPTSTATE_INITIALIZER(DEFINED);
+ char const * pzArg = pOD->optArg.argString;
+ tSuccess succ;
+
+ if (reset_active)
+ return;
+
+ if ( (! HAS_originalOptArgArray(pOpts))
+ || (pOpts->originalOptArgCookie == NULL)) {
+ fputs(zResetNotConfig, stderr);
+ _exit(EX_SOFTWARE);
+ }
+
+ if ((pzArg == NULL) || (*pzArg == NUL)) {
+ fputs(zNoResetArg, stderr);
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ }
+
+ reset_active = AG_TRUE;
+
+ if (pzArg[1] == NUL) {
+ if (*pzArg == '*') {
+ optionResetEverything(pOpts);
+ reset_active = AG_FALSE;
+ return;
+ }
+
+ succ = shortOptionFind(pOpts, (tAoUC)*pzArg, &opt_state);
+ if (! SUCCESSFUL(succ)) {
+ fprintf(stderr, zIllOptChr, pOpts->pzProgPath, *pzArg);
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ }
+ } else {
+ succ = longOptionFind(pOpts, (char *)pzArg, &opt_state);
+ if (! SUCCESSFUL(succ)) {
+ fprintf(stderr, zIllOptStr, pOpts->pzProgPath, pzArg);
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ }
+ }
+
+ /*
+ * We've found the indicated option. Turn off all non-persistent
+ * flags because we're forcing the option back to its initialized state.
+ * Call any callout procedure to handle whatever it needs to.
+ * Finally, clear the reset flag, too.
+ */
+ optionReset(pOpts, opt_state.pOD);
+ reset_active = AG_FALSE;
+}
+/*
+ * Local Variables:
+ * mode: C
+ * c-file-style: "stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * end of autoopts/reset.c */
/*
- * restore.c $Id: restore.c,v 4.10 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2007-01-13 14:13:17 bkorb"
+ * restore.c $Id: restore.c,v 4.14 2009/01/01 16:51:49 bkorb Exp $
+ * Time-stamp: "2007-07-04 11:34:40 bkorb"
*
* This module's routines will save the current option state to memory
* and restore it. If saved prior to the initial optionProcess call,
* then the initial state will be restored.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
- *
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
- *
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
- *
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ *
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
+ *
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
+ *
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
+ *
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
+ *
+ * These files have the following md5sums:
+ *
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
/*
/*
- * save.c $Id: save.c,v 4.18 2007/04/15 19:01:18 bkorb Exp $
- * Time-stamp: "2007-04-15 11:11:10 bkorb"
+ * save.c $Id: save.c,v 4.29 2009/01/01 16:51:49 bkorb Exp $
+ * Time-stamp: "2008-09-23 14:24:58 bkorb"
*
* This module's routines will take the currently set options and
* store them into an ".rc" file for re-interpretation the next
* time the invoking program is run.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
*
- * Automated Options 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.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * These files have the following md5sums:
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
-tSCC zWarn[] = "%s WARNING: cannot save options - ";
+static char const zWarn[] = "%s WARNING: cannot save options - ";
+static char const close_xml[] = "</%s>\n";
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static tCC*
findDirName( tOptions* pOpts, int* p_free );
FILE * fp,
tOptDesc * p,
tCC* pzLA );
+
+static void
+print_a_value(FILE * fp, int depth, tOptDesc * pOD, tOptionValue const * ovp);
+
+static void
+print_a_string(FILE * fp, char const * name, char const * pz);
+
+static void
+printValueList(FILE * fp, char const * name, tArgList * al);
+
+static void
+printHierarchy(FILE * fp, tOptDesc * p);
+
+static FILE *
+openSaveFile( tOptions* pOpts );
+
+static void
+printNoArgOpt(FILE * fp, tOptDesc * p, tOptDesc * pOD);
+
+static void
+printStringArg(FILE * fp, tOptDesc * pOD);
+
+static void
+printEnumArg(FILE * fp, tOptDesc * pOD);
+
+static void
+printSetMemberArg(FILE * fp, tOptDesc * pOD);
+
+static void
+printFileArg(FILE * fp, tOptDesc * pOD, tOptions* pOpts);
/* = = = END-STATIC-FORWARD = = = */
static tCC*
}
-/*=export_func optionSaveFile
- *
- * what: saves the option state to a file
- *
- * arg: tOptions*, pOpts, program options descriptor
- *
- * doc:
- *
- * This routine will save the state of option processing to a file. The name
- * of that file can be specified with the argument to the @code{--save-opts}
- * option, or by appending the @code{rcfile} attribute to the last
- * @code{homerc} attribute. If no @code{rcfile} attribute was specified, it
- * will default to @code{.@i{programname}rc}. If you wish to specify another
- * file, you should invoke the @code{SET_OPT_SAVE_OPTS( @i{filename} )} macro.
- *
- * err:
- *
- * If no @code{homerc} file was specified, this routine will silently return
- * and do nothing. If the output file cannot be created or updated, a message
- * will be printed to @code{stderr} and the routine will return.
-=*/
-void
-optionSaveFile( tOptions* pOpts )
+static void
+print_a_value(FILE * fp, int depth, tOptDesc * pOD, tOptionValue const * ovp)
+{
+ static char const bool_atr[] = "<%1$s type=boolean>%2$s</%1$s>\n";
+ static char const numb_atr[] = "<%1$s type=integer>0x%2$lX</%1$s>\n";
+ static char const type_atr[] = "<%s type=%s>";
+ static char const null_atr[] = "<%s/>\n";
+
+ while (--depth >= 0)
+ putc(' ', fp), putc(' ', fp);
+
+ switch (ovp->valType) {
+ default:
+ case OPARG_TYPE_NONE:
+ fprintf(fp, null_atr, ovp->pzName);
+ break;
+
+ case OPARG_TYPE_STRING:
+ print_a_string(fp, ovp->pzName, ovp->v.strVal);
+ break;
+
+ case OPARG_TYPE_ENUMERATION:
+ case OPARG_TYPE_MEMBERSHIP:
+ if (pOD != NULL) {
+ tAoUI opt_state = pOD->fOptState;
+ uintptr_t val = pOD->optArg.argEnum;
+ char const * typ = (ovp->valType == OPARG_TYPE_ENUMERATION)
+ ? "keyword" : "set-membership";
+
+ fprintf(fp, type_atr, ovp->pzName, typ);
+
+ /*
+ * This is a magic incantation that will convert the
+ * bit flag values back into a string suitable for printing.
+ */
+ (*(pOD->pOptProc))(OPTPROC_RETURN_VALNAME, pOD );
+ if (pOD->optArg.argString != NULL) {
+ fputs(pOD->optArg.argString, fp);
+
+ if (ovp->valType != OPARG_TYPE_ENUMERATION) {
+ /*
+ * set membership strings get allocated
+ */
+ AGFREE( (void*)pOD->optArg.argString );
+ }
+ }
+
+ pOD->optArg.argEnum = val;
+ pOD->fOptState = opt_state;
+ fprintf(fp, close_xml, ovp->pzName);
+ break;
+ }
+ /* FALLTHROUGH */
+
+ case OPARG_TYPE_NUMERIC:
+ fprintf(fp, numb_atr, ovp->pzName, ovp->v.longVal);
+ break;
+
+ case OPARG_TYPE_BOOLEAN:
+ fprintf(fp, bool_atr, ovp->pzName,
+ ovp->v.boolVal ? "true" : "false");
+ break;
+
+ case OPARG_TYPE_HIERARCHY:
+ printValueList(fp, ovp->pzName, ovp->v.nestVal);
+ break;
+ }
+}
+
+
+static void
+print_a_string(FILE * fp, char const * name, char const * pz)
+{
+ static char const open_atr[] = "<%s>";
+
+ fprintf(fp, open_atr, name);
+ for (;;) {
+ int ch = ((int)*(pz++)) & 0xFF;
+
+ switch (ch) {
+ case NUL: goto string_done;
+
+ case '&':
+ case '<':
+ case '>':
+#if __GNUC__ >= 4
+ case 1 ... (' ' - 1):
+ case ('~' + 1) ... 0xFF:
+#endif
+ emit_special_char(fp, ch);
+ break;
+
+ default:
+#if __GNUC__ < 4
+ if ( ((ch >= 1) && (ch <= (' ' - 1)))
+ || ((ch >= ('~' + 1)) && (ch <= 0xFF)) ) {
+ emit_special_char(fp, ch);
+ break;
+ }
+#endif
+ putc(ch, fp);
+ }
+ } string_done:;
+ fprintf(fp, close_xml, name);
+}
+
+
+static void
+printValueList(FILE * fp, char const * name, tArgList * al)
+{
+ static int depth = 1;
+
+ int sp_ct;
+ int opt_ct;
+ void ** opt_list;
+
+ if (al == NULL)
+ return;
+ opt_ct = al->useCt;
+ opt_list = (void **)al->apzArgs;
+
+ if (opt_ct <= 0) {
+ fprintf(fp, "<%s/>\n", name);
+ return;
+ }
+
+ fprintf(fp, "<%s type=nested>\n", name);
+
+ depth++;
+ while (--opt_ct >= 0) {
+ tOptionValue const * ovp = *(opt_list++);
+
+ print_a_value(fp, depth, NULL, ovp);
+ }
+ depth--;
+
+ for (sp_ct = depth; --sp_ct >= 0;)
+ putc(' ', fp), putc(' ', fp);
+ fprintf(fp, "</%s>\n", name);
+}
+
+
+static void
+printHierarchy(FILE * fp, tOptDesc * p)
+{
+ int opt_ct;
+ tArgList * al = p->optCookie;
+ void ** opt_list;
+
+ if (al == NULL)
+ return;
+
+ opt_ct = al->useCt;
+ opt_list = (void **)al->apzArgs;
+
+ if (opt_ct <= 0)
+ return;
+
+ do {
+ tOptionValue const * base = *(opt_list++);
+ tOptionValue const * ovp = optionGetValue(base, NULL);
+
+ if (ovp == NULL)
+ continue;
+
+ fprintf(fp, "<%s type=nested>\n", p->pz_Name);
+
+ do {
+ print_a_value(fp, 1, p, ovp);
+
+ } while (ovp = optionNextValue(base, ovp),
+ ovp != NULL);
+
+ fprintf(fp, "</%s>\n", p->pz_Name);
+ } while (--opt_ct > 0);
+}
+
+
+static FILE *
+openSaveFile( tOptions* pOpts )
{
- tOptDesc* pOD;
- int ct;
FILE* fp;
{
int free_name = 0;
tCC* pzFName = findFileName( pOpts, &free_name );
if (pzFName == NULL)
- return;
+ return NULL;
fp = fopen( pzFName, "w" FOPEN_BINARY_FLAG );
if (fp == NULL) {
fprintf( stderr, zNoCreat, errno, strerror( errno ), pzFName );
if (free_name)
AGFREE((void*) pzFName );
- return;
+ return fp;
}
if (free_name)
#endif
}
+ return fp;
+}
+
+static void
+printNoArgOpt(FILE * fp, tOptDesc * p, tOptDesc * pOD)
+{
+ /*
+ * The aliased to argument indicates whether or not the option
+ * is "disabled". However, the original option has the name
+ * string, so we get that there, not with "p".
+ */
+ char const * pznm =
+ (DISABLED_OPT( p )) ? pOD->pz_DisableName : pOD->pz_Name;
+ /*
+ * If the option was disabled and the disablement name is NULL,
+ * then the disablement was caused by aliasing.
+ * Use the name as the string to emit.
+ */
+ if (pznm == NULL)
+ pznm = pOD->pz_Name;
+
+ fprintf(fp, "%s\n", pznm);
+}
+
+static void
+printStringArg(FILE * fp, tOptDesc * pOD)
+{
+ if (pOD->fOptState & OPTST_STACKED) {
+ tArgList* pAL = (tArgList*)pOD->optCookie;
+ int uct = pAL->useCt;
+ tCC** ppz = pAL->apzArgs;
+
+ /*
+ * un-disable multiple copies of disabled options.
+ */
+ if (uct > 1)
+ pOD->fOptState &= ~OPTST_DISABLED;
+
+ while (uct-- > 0)
+ printEntry( fp, pOD, *(ppz++) );
+ } else {
+ printEntry( fp, pOD, pOD->optArg.argString );
+ }
+}
+
+static void
+printEnumArg(FILE * fp, tOptDesc * pOD)
+{
+ uintptr_t val = pOD->optArg.argEnum;
+
+ /*
+ * This is a magic incantation that will convert the
+ * bit flag values back into a string suitable for printing.
+ */
+ (*(pOD->pOptProc))(OPTPROC_RETURN_VALNAME, pOD);
+ printEntry( fp, pOD, (void*)(pOD->optArg.argString));
+
+ pOD->optArg.argEnum = val;
+}
+
+static void
+printSetMemberArg(FILE * fp, tOptDesc * pOD)
+{
+ uintptr_t val = pOD->optArg.argEnum;
+
+ /*
+ * This is a magic incantation that will convert the
+ * bit flag values back into a string suitable for printing.
+ */
+ (*(pOD->pOptProc))(OPTPROC_RETURN_VALNAME, pOD);
+ printEntry( fp, pOD, (void*)(pOD->optArg.argString));
+
+ if (pOD->optArg.argString != NULL) {
+ /*
+ * set membership strings get allocated
+ */
+ AGFREE( (void*)pOD->optArg.argString );
+ pOD->fOptState &= ~OPTST_ALLOC_ARG;
+ }
+
+ pOD->optArg.argEnum = val;
+}
+
+static void
+printFileArg(FILE * fp, tOptDesc * pOD, tOptions* pOpts)
+{
+ /*
+ * If the cookie is not NULL, then it has the file name, period.
+ * Otherwise, if we have a non-NULL string argument, then....
+ */
+ if (pOD->optCookie != NULL)
+ printEntry(fp, pOD, pOD->optCookie);
+
+ else if (HAS_originalOptArgArray(pOpts)) {
+ char const * orig =
+ pOpts->originalOptArgArray[pOD->optIndex].argString;
+
+ if (pOD->optArg.argString == orig)
+ return;
+
+ printEntry(fp, pOD, pOD->optArg.argString);
+ }
+}
+
+
+/*=export_func optionSaveFile
+ *
+ * what: saves the option state to a file
+ *
+ * arg: tOptions*, pOpts, program options descriptor
+ *
+ * doc:
+ *
+ * This routine will save the state of option processing to a file. The name
+ * of that file can be specified with the argument to the @code{--save-opts}
+ * option, or by appending the @code{rcfile} attribute to the last
+ * @code{homerc} attribute. If no @code{rcfile} attribute was specified, it
+ * will default to @code{.@i{programname}rc}. If you wish to specify another
+ * file, you should invoke the @code{SET_OPT_SAVE_OPTS( @i{filename} )} macro.
+ *
+ * The recommend usage is as follows:
+ * @example
+ * optionProcess(&progOptions, argc, argv);
+ * if (i_want_a_non_standard_place_for_this)
+ * SET_OPT_SAVE_OPTS("myfilename");
+ * optionSaveFile(&progOptions);
+ * @end example
+ *
+ * err:
+ *
+ * If no @code{homerc} file was specified, this routine will silently return
+ * and do nothing. If the output file cannot be created or updated, a message
+ * will be printed to @code{stderr} and the routine will return.
+=*/
+void
+optionSaveFile( tOptions* pOpts )
+{
+ tOptDesc* pOD;
+ int ct;
+ FILE* fp = openSaveFile(pOpts);
+
+ if (fp == NULL)
+ return;
+
/*
* FOR each of the defined options, ...
*/
ct = pOpts->presetOptCt;
pOD = pOpts->pOptDesc;
do {
- int arg_state;
tOptDesc* p;
/*
* OR it does not take an initialization value
* OR it is equivalenced to another option
* THEN continue (ignore it)
+ *
+ * Equivalenced options get picked up when the equivalenced-to
+ * option is processed.
*/
if (UNUSED_OPT( pOD ))
continue;
- if ((pOD->fOptState & (OPTST_NO_INIT|OPTST_DOCUMENT|OPTST_OMITTED))
- != 0)
+ if ((pOD->fOptState & OPTST_DO_NOT_SAVE_MASK) != 0)
continue;
if ( (pOD->optEquivIndex != NO_EQUIVALENT)
- && (pOD->optEquivIndex != pOD->optIndex))
+ && (pOD->optEquivIndex != pOD->optIndex))
continue;
/*
- * Set a temporary pointer to the real option description
- * (i.e. account for equivalencing)
+ * The option argument data are found at the equivalenced-to option,
+ * but the actual option argument type comes from the original
+ * option descriptor. Be careful!
*/
p = ((pOD->fOptState & OPTST_EQUIVALENCE) != 0)
? (pOpts->pOptDesc + pOD->optActualIndex) : pOD;
- /*
- * IF no arguments are allowed
- * THEN just print the name and continue
- */
- if (OPTST_GET_ARGTYPE(pOD->fOptState) == OPARG_TYPE_NONE) {
- char const * pznm =
- (DISABLED_OPT( p )) ? p->pz_DisableName : p->pz_Name;
- /*
- * If the option was disabled and the disablement name is NULL,
- * then the disablement was caused by aliasing.
- * Use the name as the string to emit.
- */
- if (pznm == NULL)
- pznm = p->pz_Name;
-
- fprintf(fp, "%s\n", pznm);
- continue;
- }
+ switch (OPTST_GET_ARGTYPE(pOD->fOptState)) {
+ case OPARG_TYPE_NONE:
+ printNoArgOpt(fp, p, pOD);
+ break;
- arg_state = OPTST_GET_ARGTYPE(p->fOptState);
- switch (arg_state) {
- case 0:
case OPARG_TYPE_NUMERIC:
printEntry( fp, p, (void*)(p->optArg.argInt));
break;
case OPARG_TYPE_STRING:
- if (p->fOptState & OPTST_STACKED) {
- tArgList* pAL = (tArgList*)p->optCookie;
- int uct = pAL->useCt;
- tCC** ppz = pAL->apzArgs;
-
- /*
- * Disallow multiple copies of disabled options.
- */
- if (uct > 1)
- p->fOptState &= ~OPTST_DISABLED;
-
- while (uct-- > 0)
- printEntry( fp, p, *(ppz++) );
- } else {
- printEntry( fp, p, p->optArg.argString );
- }
+ printStringArg(fp, p);
break;
case OPARG_TYPE_ENUMERATION:
- case OPARG_TYPE_MEMBERSHIP:
- {
- uintptr_t val = p->optArg.argEnum;
- /*
- * This is a magic incantation that will convert the
- * bit flag values back into a string suitable for printing.
- */
- (*(p->pOptProc))( (tOptions*)2UL, p );
- printEntry( fp, p, (void*)(p->optArg.argString));
-
- if ( (p->optArg.argString != NULL)
- && (arg_state != OPARG_TYPE_ENUMERATION)) {
- /*
- * set membership strings get allocated
- */
- AGFREE( (void*)p->optArg.argString );
- p->fOptState &= ~OPTST_ALLOC_ARG;
- }
+ printEnumArg(fp, p);
+ break;
- p->optArg.argEnum = val;
+ case OPARG_TYPE_MEMBERSHIP:
+ printSetMemberArg(fp, p);
break;
- }
case OPARG_TYPE_BOOLEAN:
printEntry( fp, p, p->optArg.argBool ? "true" : "false" );
break;
+ case OPARG_TYPE_HIERARCHY:
+ printHierarchy(fp, p);
+ break;
+
+ case OPARG_TYPE_FILE:
+ printFileArg(fp, p, pOpts);
+ break;
+
default:
break; /* cannot handle - skip it */
}
/*
- * sort.c $Id: sort.c,v 4.10 2007/04/28 22:19:23 bkorb Exp $
- * Time-stamp: "2006-10-18 11:29:04 bkorb"
+ * sort.c $Id: sort.c,v 4.15 2009/01/01 16:51:49 bkorb Exp $
+ * Time-stamp: "2007-07-04 11:34:52 bkorb"
*
* This module implements argument sorting.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
+ * These files have the following md5sums:
*
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static tSuccess
mustHandleArg( tOptions* pOpts, char* pzArg, tOptState* pOS,
char** ppzOpts, int* pOptsIdx );
/*
* stack.c
- * $Id: stack.c,v 4.13 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2007-01-13 10:43:21 bkorb"
+ * $Id: stack.c,v 4.18 2009/01/01 16:51:49 bkorb Exp $
+ * Time-stamp: "2008-07-30 16:56:32 bkorb"
*
* This is a special option processing routine that will save the
* argument to an option in a FIFO queue.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
*
- * Automated Options 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.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * These files have the following md5sums:
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
#ifdef WITH_LIBREGEX
{
int res;
- tArgList* pAL = (tArgList*)pOptDesc->optCookie;
+ tArgList* pAL;
+
+ if ((pOptDesc->fOptState & OPTST_RESET) != 0)
+ return;
+ pAL = (tArgList*)pOptDesc->optCookie;
+
/*
* IF we don't have any stacked options,
* THEN indicate that we don't have any of these options
{
char * pz;
- if (pOD->optArg.argString == NULL)
- return;
+ if ((pOD->fOptState & OPTST_RESET) != 0) {
+ tArgList* pAL = (void*)pOD->optCookie;
+ int ix;
+ if (pAL == NULL)
+ return;
+
+ ix = pAL->useCt;
+ while (--ix >= 0)
+ AGFREE(pAL->apzArgs[ix]);
+ AGFREE(pAL);
- AGDUPSTR(pz, pOD->optArg.argString, "stack arg");
- addArgListEntry( &(pOD->optCookie), (void*)pz );
+ } else {
+ if (pOD->optArg.argString == NULL)
+ return;
+
+ AGDUPSTR(pz, pOD->optArg.argString, "stack arg");
+ addArgListEntry( &(pOD->optCookie), (void*)pz );
+ }
}
/*
* Local Variables:
/*
- * $Id: streqvcmp.c,v 4.10 2007/04/28 22:19:23 bkorb Exp $
- * Time-stamp: "2006-07-26 18:25:53 bkorb"
+ * $Id: streqvcmp.c,v 4.15 2009/01/01 16:51:49 bkorb Exp $
+ * Time-stamp: "2008-12-26 10:15:46 bkorb"
*
* String Equivalence Comparison
*
* character before comparison. In processing long option names,
* the characters "-", "_" and "^" all need to be equivalent
* (because they are treated so by different development environments).
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
- *
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
- *
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
- *
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
- */
-
-/*
+ *
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
+ *
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
+ *
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
+ *
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
+ *
+ * These files have the following md5sums:
+ *
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
+ *
* This array is designed for mapping upper and lower case letter
* together for a case independent comparison. The mappings are
* based upon ascii character sequences.
* This function name is mapped to option_strtransform so as to not conflict
* with the POSIX name space.
*
+ * The source and destination may be the same.
+ *
* err: none.
=*/
void
/*
- * $Id: text_mmap.c,v 4.15 2006/11/27 01:52:23 bkorb Exp $
+ * $Id: text_mmap.c,v 4.19 2009/01/01 16:51:49 bkorb Exp $
*
- * Time-stamp: "2006-09-10 14:50:04 bkorb"
+ * Time-stamp: "2007-07-04 11:35:49 bkorb"
+ *
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
+ *
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
+ *
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
+ *
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
+ *
+ * These files have the following md5sums:
+ *
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
#ifndef MAP_ANONYMOUS
--- /dev/null
+
+/*
+ * $Id: time.c,v 4.3 2009/01/01 16:51:50 bkorb Exp $
+ * Time-stamp: "2008-11-16 14:51:48 bkorb"
+ *
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
+ *
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
+ *
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
+ *
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
+ *
+ * These files have the following md5sums:
+ *
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
+ */
+
+#ifndef HAVE_PARSE_DURATION
+#include <time.h>
+
+static inline char *
+ao_xstrdup(char const * pz)
+{
+ char * str;
+ AGDUPSTR(str, pz, "time val str");
+ return str;
+}
+
+#define xstrdup(_s) ao_xstrdup(_s)
+
+#include "parse-duration.c"
+
+#undef xstrdup
+#endif
+
+/*=export_func optionTimeVal
+ * private:
+ *
+ * what: process an option with a time value.
+ * arg: + tOptions* + pOpts + program options descriptor +
+ * arg: + tOptDesc* + pOptDesc + the descriptor for this arg +
+ *
+ * doc:
+ * Decipher a time duration value.
+=*/
+void
+optionTimeVal(tOptions* pOpts, tOptDesc* pOD )
+{
+ long val;
+
+ if ((pOD->fOptState & OPTST_RESET) != 0)
+ return;
+
+ val = parse_duration(pOD->optArg.argString);
+ if (errno != 0)
+ goto bad_time;
+
+ if (pOD->fOptState & OPTST_ALLOC_ARG) {
+ AGFREE(pOD->optArg.argString);
+ pOD->fOptState &= ~OPTST_ALLOC_ARG;
+ }
+
+ pOD->optArg.argInt = val;
+ return;
+
+bad_time:
+ fprintf( stderr, zNotNumber, pOpts->pzProgName, pOD->optArg.argString );
+ if ((pOpts->fOptSet & OPTPROC_ERRSTOP) != 0)
+ (*(pOpts->pUsageProc))(pOpts, EXIT_FAILURE);
+
+ pOD->optArg.argInt = ~0;
+}
+/*
+ * Local Variables:
+ * mode: C
+ * c-file-style: "stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * end of autoopts/numeric.c */
/*
* This file defines the string_tokenize interface
- * Time-stamp: "2006-06-24 15:27:49 bkorb"
+ * Time-stamp: "2007-11-12 20:40:36 bkorb"
*
- * string_tokenize copyright 2005 Bruce Korb
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * string_tokenize is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * string_tokenize 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
- * Lesser General Public License for more details.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with string_tokenize; if not, write to:
- * The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
+ *
+ * These files have the following md5sums:
+ *
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
-#include <ctype.h>
+
#include <errno.h>
#include <stdlib.h>
#define ch_t unsigned char
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static void
copy_cooked( ch_t** ppDest, char const ** ppSrc );
* Trim leading white space. Use "ENOENT" and a NULL return to indicate
* an empty string was passed.
*/
- while (isspace( (ch_t)*str )) str++;
+ while (IS_WHITESPACE_CHAR(*str)) str++;
if (*str == NUL) {
bogus_str:
errno = ENOENT;
do {
max_token_ct++;
- while (! isspace( *++pz ))
+ while (! IS_WHITESPACE_CHAR(*++pz))
if (*pz == NUL) goto found_nul;
- while (isspace( *pz )) pz++;
+ while (IS_WHITESPACE_CHAR(*pz)) pz++;
} while (*pz != NUL);
found_nul:
res->tkn_list[ res->tkn_ct++ ] = pzDest;
for (;;) {
int ch = (ch_t)*str;
- if (isspace( ch )) {
+ if (IS_WHITESPACE_CHAR(ch)) {
found_white_space:
- while (isspace( (ch_t)*++str )) ;
+ while (IS_WHITESPACE_CHAR(*++str)) ;
break;
}
errno = EINVAL;
return NULL;
}
- if (isspace( (ch_t)*str ))
+ if (IS_WHITESPACE_CHAR(*str))
goto found_white_space;
break;
errno = EINVAL;
return NULL;
}
- if (isspace( (ch_t)*str ))
+ if (IS_WHITESPACE_CHAR(*str))
goto found_white_space;
break;
/*
- * usage.c $Id: usage.c,v 4.15 2007/04/28 22:19:23 bkorb Exp $
- * Time-stamp: "2007-04-15 11:02:46 bkorb"
+ * usage.c $Id: usage.c,v 4.30 2009/01/17 22:08:07 bkorb Exp $
+ * Time-stamp: "2009-01-17 13:18:23 bkorb"
*
* This module implements the default usage procedure for
* Automated Options. It may be overridden, of course.
*/
/*
- * Automated Options copyright 1992-2007 Bruce Korb
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * Automated Options 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.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * These files have the following md5sums:
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
- *
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
- *
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
#define OPTPROC_L_N_S (OPTPROC_LONGOPT | OPTPROC_SHORTOPT)
static ag_bool displayEnum;
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static ag_bool
checkGNUUsage( tOptions* pOpts );
* Paged usage will preset option_usage_fp to an output file.
* If it hasn't already been set, then set it to standard output
* on successful exit (help was requested), otherwise error out.
+ *
+ * Test the version before obtaining pzFullUsage or pzShortUsage.
+ * These fields do not exist before revision 30.
*/
- if (option_usage_fp == NULL)
- option_usage_fp = (actual_exit_code != EXIT_SUCCESS) ? stderr : stdout;
+ {
+ char const * pz;
+
+ if (actual_exit_code == EXIT_SUCCESS) {
+ pz = (pOptions->structVersion >= 30 * 4096)
+ ? pOptions->pzFullUsage : NULL;
+
+ if (option_usage_fp == NULL)
+ option_usage_fp = stdout;
+ } else {
+ pz = (pOptions->structVersion >= 30 * 4096)
+ ? pOptions->pzShortUsage : NULL;
+
+ if (option_usage_fp == NULL)
+ option_usage_fp = stderr;
+ }
+
+ if (pz != NULL) {
+ fputs(pz, option_usage_fp);
+ exit(actual_exit_code);
+ }
+ }
fprintf( option_usage_fp, pOptions->pzUsageTitle, pOptions->pzProgName );
fprintf( option_usage_fp, zDis, pOD->pz_DisableName );
/*
- * IF the numeric option has a special callback,
- * THEN call it, requesting the range or other special info
+ * Check for argument types that have callbacks with magical properties
*/
- if ( (OPTST_GET_ARGTYPE(pOD->fOptState) == OPARG_TYPE_NUMERIC)
- && (pOD->pOptProc != NULL)
- && (pOD->pOptProc != optionNumericVal) ) {
- (*(pOD->pOptProc))( pOptions, NULL );
+ switch (OPTST_GET_ARGTYPE(pOD->fOptState)) {
+ case OPARG_TYPE_NUMERIC:
+ /*
+ * IF the numeric option has a special callback,
+ * THEN call it, requesting the range or other special info
+ */
+ if ( (pOD->pOptProc != NULL)
+ && (pOD->pOptProc != optionNumericVal) ) {
+ (*(pOD->pOptProc))(OPTPROC_EMIT_USAGE, pOD);
+ }
+ break;
+
+ case OPARG_TYPE_FILE:
+ (*(pOD->pOptProc))(OPTPROC_EMIT_USAGE, pOD);
+ break;
}
/*
*/
if ((pOptions->fOptSet & OPTPROC_SHORTOPT) == 0)
fputs( pAT->pzSpc, option_usage_fp );
- else if (! isgraph( pOD->optValue)) {
+ else if (! IS_GRAPHIC_CHAR(pOD->optValue)) {
if ( (pOptions->fOptSet & (OPTPROC_GNUUSAGE|OPTPROC_LONGOPT))
== (OPTPROC_GNUUSAGE|OPTPROC_LONGOPT))
fputc( ' ', option_usage_fp );
* when the option argument is required, base the type string on the
* argument type.
*/
- if (OPTST_GET_ARGTYPE(pOD->fOptState) == OPARG_TYPE_NONE) {
- pzArgType = pAT->pzNo;
-
- } else if (pOD->fOptState & OPTST_ARG_OPTIONAL) {
+ if (pOD->fOptState & OPTST_ARG_OPTIONAL) {
pzArgType = pAT->pzOpt;
} else switch (OPTST_GET_ARGTYPE(pOD->fOptState)) {
+ case OPARG_TYPE_NONE: pzArgType = pAT->pzNo; break;
case OPARG_TYPE_ENUMERATION: pzArgType = pAT->pzKey; break;
+ case OPARG_TYPE_FILE : pzArgType = pAT->pzFile; break;
case OPARG_TYPE_MEMBERSHIP: pzArgType = pAT->pzKeyL; break;
case OPARG_TYPE_BOOLEAN: pzArgType = pAT->pzBool; break;
case OPARG_TYPE_NUMERIC: pzArgType = pAT->pzNum; break;
case OPARG_TYPE_HIERARCHY: pzArgType = pAT->pzNest; break;
case OPARG_TYPE_STRING: pzArgType = pAT->pzStr; break;
- default: goto bogus_desc; break;
+ case OPARG_TYPE_TIME: pzArgType = pAT->pzTime; break;
+ default: goto bogus_desc;
}
snprintf( z, sizeof(z), pAT->pzOptFmt, pzArgType, pOD->pz_Name,
int docCt = 0;
do {
- if ((pOD->fOptState & OPTST_OMITTED) != 0)
+ if ((pOD->fOptState & OPTST_NO_USAGE_MASK) != 0)
continue;
if ((pOD->fOptState & OPTST_DOCUMENT) != 0) {
* THEN document that the remaining options are not user opts
*/
if ( (pOpts->presetOptCt == optNo)
- && (ex_code == EXIT_SUCCESS)
- && (docCt > 0)
- && ((pOD[-1].fOptState & OPTST_DOCUMENT) == 0) )
+ && (ex_code == EXIT_SUCCESS)
+ && (docCt > 0)
+ && ((pOD[-1].fOptState & OPTST_DOCUMENT) == 0) )
fprintf( option_usage_fp, argTypes.pzBrk, zAuto, pOptTitle );
printOneUsage( pOpts, pOD, &argTypes );
switch (OPTST_GET_ARGTYPE(pOD->fOptState)) {
case OPARG_TYPE_ENUMERATION:
case OPARG_TYPE_MEMBERSHIP:
- (*(pOD->pOptProc))( NULL, pOD );
+ (*(pOD->pOptProc))(OPTPROC_EMIT_USAGE, pOD);
}
} while (pOD++, optNo++, (--ct > 0));
}
argTypes.pzNum = zGnuNumArg;
argTypes.pzKey = zGnuKeyArg;
argTypes.pzKeyL = zGnuKeyLArg;
+ argTypes.pzTime = zGnuTimeArg;
+ argTypes.pzFile = zGnuFileArg;
argTypes.pzBool = zGnuBoolArg;
argTypes.pzNest = zGnuNestArg;
argTypes.pzOpt = zGnuOptArg;
argTypes.pzNum = zStdNumArg;
argTypes.pzKey = zStdKeyArg;
argTypes.pzKeyL = zStdKeyLArg;
+ argTypes.pzTime = zStdTimeArg;
+ argTypes.pzFile = zStdFileArg;
argTypes.pzBool = zStdBoolArg;
argTypes.pzNest = zStdNestArg;
argTypes.pzOpt = zStdOptArg;
--- /dev/null
+/* ANSI-C code produced by gperf version 3.0.3 */
+
+
+#if 0 /* gperf build options: */
+// %struct-type
+// %language=ANSI-C
+// %includes
+// %global-table
+// %omit-struct-type
+// %readonly-tables
+// %compare-strncmp
+//
+// %define slot-name vtp_name
+// %define hash-function-name value_type_hash
+// %define lookup-function-name find_value_type_name
+// %define word-array-name value_type_table
+// %define initializer-suffix ,VTP_COUNT_KWD
+#endif /* gperf build options: */
+
+#include "value-type.h"
+
+typedef struct {
+ char const * vtp_name;
+ value_type_enum_t vtp_id;
+} value_type_map_t;
+#include <string.h>
+
+/* maximum key range = 20, duplicates = 0 */
+
+#ifdef __GNUC__
+#else
+#ifdef __cplusplus
+#endif
+#endif
+inline static unsigned int
+value_type_hash (register const char *str, register unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 10, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 5, 23, 23, 5, 0, 0, 23, 15, 23,
+ 23, 10, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23
+ };
+ return len + asso_values[(unsigned char)str[2]];
+}
+
+static const value_type_map_t value_type_table[] =
+ {
+ {"",VTP_COUNT_KWD}, {"",VTP_COUNT_KWD},
+ {"",VTP_COUNT_KWD},
+ {"set", VTP_KWD_SET},
+ {"",VTP_COUNT_KWD}, {"",VTP_COUNT_KWD},
+ {"nested", VTP_KWD_NESTED},
+ {"integer", VTP_KWD_INTEGER},
+ {"",VTP_COUNT_KWD},
+ {"bool", VTP_KWD_BOOL},
+ {"",VTP_COUNT_KWD},
+ {"string", VTP_KWD_STRING},
+ {"boolean", VTP_KWD_BOOLEAN},
+ {"",VTP_COUNT_KWD},
+ {"set-membership", VTP_KWD_SET_MEMBERSHIP},
+ {"",VTP_COUNT_KWD}, {"",VTP_COUNT_KWD},
+ {"keyword", VTP_KWD_KEYWORD},
+ {"",VTP_COUNT_KWD},
+ {"hierarchy", VTP_KWD_HIERARCHY},
+ {"",VTP_COUNT_KWD}, {"",VTP_COUNT_KWD},
+ {"invalid", VTP_KWD_INVALID}
+ };
+
+#ifdef __GNUC__
+#ifdef __GNUC_STDC_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+static inline const value_type_map_t *
+find_value_type_name (register const char *str, register unsigned int len)
+{
+ if (len <= 14 && len >= 3)
+ {
+ register int key = value_type_hash (str, len);
+
+ if (key <= 22 && key >= 0)
+ {
+ register const char *s = value_type_table[key].vtp_name;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0')
+ return &value_type_table[key];
+ }
+ }
+ return 0;
+}
+
+
+value_type_enum_t
+find_value_type_id(char const * str, unsigned int len)
+{
+ const value_type_map_t * p =
+ find_value_type_name(str, len);
+ return (p == 0) ? VTP_KWD_INVALID : p->vtp_id;
+}
--- /dev/null
+/*
+ * Generated header for gperf generated source Sat May 16 08:16:06 PDT 2009
+ * This file enumerates the list of names and declares the
+ * procedure for mapping string names to the enum value.
+ */
+#ifndef AUTOOPTS_VALUE_TYPE_H_GUARD
+#define AUTOOPTS_VALUE_TYPE_H_GUARD 1
+
+typedef enum {
+ VTP_KWD_INVALID,
+ VTP_KWD_STRING,
+ VTP_KWD_INTEGER,
+ VTP_KWD_BOOLEAN,
+ VTP_KWD_BOOL,
+ VTP_KWD_KEYWORD,
+ VTP_KWD_SET,
+ VTP_KWD_SET_MEMBERSHIP,
+ VTP_KWD_NESTED,
+ VTP_KWD_HIERARCHY,
+ VTP_COUNT_KWD
+} value_type_enum_t;
+
+extern value_type_enum_t
+find_value_type_id(char const * str, unsigned int len);
+#endif /* AUTOOPTS_VALUE_TYPE_H_GUARD */
-/* $Id: version.c,v 4.10 2007/04/28 22:19:23 bkorb Exp $
- * Time-stamp: "2007-04-28 10:08:34 bkorb"
+/* $Id: version.c,v 4.16 2009/01/01 16:51:50 bkorb Exp $
+ * Time-stamp: "2008-07-27 10:11:30 bkorb"
*
* This module implements the default usage procedure for
* Automated Options. It may be overridden, of course.
*/
-static char const zAOV[] =
- "Automated Options version %s, copyright (c) 1999-2007 Bruce Korb\n";
-
-/* Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+/*
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
+ * These files have the following md5sums:
*
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static void
printVersion( tOptions* pOpts, tOptDesc* pOD, FILE* fp );
/* = = = END-STATIC-FORWARD = = = */
fputs( pOpts->pzCopyright, fp );
fputc( '\n', fp );
}
- fprintf( fp, zAOV, optionVersion() );
+ fprintf( fp, zAO_Ver, optionVersion() );
if (pOpts->pzBugAddr != NULL)
fprintf( fp, zPlsSendBugs, pOpts->pzBugAddr );
break;
fputc( '\n', fp );
}
- fprintf( fp, zAOV, optionVersion() );
+ fprintf( fp, zAO_Ver, optionVersion() );
if (pOpts->pzBugAddr != NULL)
fprintf( fp, zPlsSendBugs, pOpts->pzBugAddr );
break;
--- /dev/null
+/* ANSI-C code produced by gperf version 3.0.3 */
+
+
+#if 0 /* gperf build options: */
+// %struct-type
+// %language=ANSI-C
+// %includes
+// %global-table
+// %omit-struct-type
+// %readonly-tables
+// %compare-strncmp
+//
+// %define slot-name xat_name
+// %define hash-function-name xat_attribute_hash
+// %define lookup-function-name find_xat_attribute_name
+// %define word-array-name xat_attribute_table
+// %define initializer-suffix ,XAT_COUNT_KWD
+#endif /* gperf build options: */
+
+#include "xat-attribute.h"
+
+typedef struct {
+ char const * xat_name;
+ xat_attribute_enum_t xat_id;
+} xat_attribute_map_t;
+#include <string.h>
+
+/* maximum key range = 9, duplicates = 0 */
+
+#ifdef __GNUC__
+#else
+#ifdef __cplusplus
+#endif
+#endif
+inline static unsigned int
+xat_attribute_hash (register const char *str, register unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 0,
+ 13, 13, 13, 13, 13, 5, 13, 5, 13, 0,
+ 13, 13, 13, 13, 13, 13, 0, 0, 13, 0,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13
+ };
+ return len + asso_values[(unsigned char)str[0]];
+}
+
+static const xat_attribute_map_t xat_attribute_table[] =
+ {
+ {"",XAT_COUNT_KWD}, {"",XAT_COUNT_KWD},
+ {"",XAT_COUNT_KWD}, {"",XAT_COUNT_KWD},
+ {"type", XAT_KWD_TYPE},
+ {"words", XAT_KWD_WORDS},
+ {"cooked", XAT_KWD_COOKED},
+ {"members", XAT_KWD_MEMBERS},
+ {"uncooked", XAT_KWD_UNCOOKED},
+ {"keep", XAT_KWD_KEEP},
+ {"",XAT_COUNT_KWD}, {"",XAT_COUNT_KWD},
+ {"invalid", XAT_KWD_INVALID}
+ };
+
+#ifdef __GNUC__
+#ifdef __GNUC_STDC_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+static inline const xat_attribute_map_t *
+find_xat_attribute_name (register const char *str, register unsigned int len)
+{
+ if (len <= 8 && len >= 4)
+ {
+ register int key = xat_attribute_hash (str, len);
+
+ if (key <= 12 && key >= 0)
+ {
+ register const char *s = xat_attribute_table[key].xat_name;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0')
+ return &xat_attribute_table[key];
+ }
+ }
+ return 0;
+}
+
+
+xat_attribute_enum_t
+find_xat_attribute_id(char const * str, unsigned int len)
+{
+ const xat_attribute_map_t * p =
+ find_xat_attribute_name(str, len);
+ return (p == 0) ? XAT_KWD_INVALID : p->xat_id;
+}
--- /dev/null
+/*
+ * Generated header for gperf generated source Sat May 16 08:16:06 PDT 2009
+ * This file enumerates the list of names and declares the
+ * procedure for mapping string names to the enum value.
+ */
+#ifndef AUTOOPTS_XAT_ATTRIBUTE_H_GUARD
+#define AUTOOPTS_XAT_ATTRIBUTE_H_GUARD 1
+
+typedef enum {
+ XAT_KWD_INVALID,
+ XAT_KWD_TYPE,
+ XAT_KWD_WORDS,
+ XAT_KWD_MEMBERS,
+ XAT_KWD_COOKED,
+ XAT_KWD_UNCOOKED,
+ XAT_KWD_KEEP,
+ XAT_COUNT_KWD
+} xat_attribute_enum_t;
+
+extern xat_attribute_enum_t
+find_xat_attribute_id(char const * str, unsigned int len);
+#endif /* AUTOOPTS_XAT_ATTRIBUTE_H_GUARD */
--- /dev/null
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ copyright (c) 2009 by Bruce Korb - all rights reserved
+ 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) by Bruce Korb - all rights reserved
+
+ 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 <http://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) by Bruce Korb - all rights reserved
+ 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
+<http://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
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+++ /dev/null
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-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 this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-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
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser 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 Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "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
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY 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
-LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey 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 library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
--- /dev/null
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ copyright (c) 2009 by Bruce Korb - all rights reserved
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser 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
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
endif
libopts_la_SOURCES = libopts.c
libopts_la_CPPFLAGS = -I$(top_srcdir)
-libopts_la_LDFLAGS = -version-info 29:0:4
+libopts_la_LDFLAGS = -version-info 32:1:7
EXTRA_DIST = \
- COPYING.lgpl COPYING.mbsd MakeDefs.inc \
- README autoopts/options.h autoopts/usage-txt.h \
- autoopts.c autoopts.h boolean.c \
- compat/windows-config.h compat/compat.h compat/pathfind.c \
- compat/snprintf.c compat/strdup.c compat/strchr.c \
- configfile.c cook.c enumeration.c \
- environment.c genshell.c genshell.h \
+ COPYING.gplv3 COPYING.lgplv3 COPYING.mbsd \
+ MakeDefs.inc README ag-char-map.h \
+ autoopts/options.h autoopts/usage-txt.h autoopts.c \
+ autoopts.h boolean.c compat/windows-config.h \
+ compat/compat.h compat/pathfind.c compat/snprintf.c \
+ compat/strdup.c compat/strchr.c configfile.c \
+ cook.c enumeration.c environment.c \
+ file.c genshell.c genshell.h \
load.c m4/libopts.m4 m4/liboptschk.m4 \
makeshell.c nested.c numeric.c \
- pgusage.c proto.h putshell.c \
+ parse-duration.c parse-duration.h pgusage.c \
+ proto.h putshell.c reset.c \
restore.c save.c sort.c \
stack.c streqvcmp.c text_mmap.c \
- tokenize.c usage.c version.c
+ time.c tokenize.c usage.c \
+ value-type.c value-type.h version.c \
+ xat-attribute.c xat-attribute.h
--- /dev/null
+/*
+ * Character mapping generated 05/16/09 08:16:06
+ *
+ * This file contains the character classifications
+ * used by AutoGen and AutoOpts for identifying tokens.
+ */
+#ifndef AG_CHAR_MAP_H_GUARD
+#define AG_CHAR_MAP_H_GUARD 1
+
+#ifdef HAVE_CONFIG_H
+# if defined(HAVE_INTTYPES_H)
+# include <inttypes.h>
+# elif defined(HAVE_STDINT_H)
+# include <stdint.h>
+# else
+# error "no int-types header."
+# choke-me-now.
+# endif
+#else
+# ifdef __sun
+# include <inttypes.h>
+# else
+# include <stdint.h>
+# endif
+#endif
+
+#if 0 /* mapping specification source (from autogen.map) */
+//
+// %guard autoopts_internal
+// %file ag-char-map.h
+// %table opt-char-cat
+//
+// %comment
+// This file contains the character classifications
+// used by AutoGen and AutoOpts for identifying tokens.
+// %
+//
+// lower-case "a-z"
+// upper-case "A-Z"
+// alphabetic +lower-case +upper-case
+// oct-digit "0-7"
+// dec-digit "89" +oct-digit
+// hex-digit "a-fA-F" +dec-digit
+// alphanumeric +alphabetic +dec-digit
+// var-first "_" +alphabetic
+// variable-name +var-first +dec-digit
+// option-name "^-" +variable-name
+// value-name ":" +option-name
+// horiz-white "\t "
+// compound-name "[.]" +value-name +horiz-white
+// whitespace "\v\f\r\n\b" +horiz-white
+// unquotable "!-~" -"\"#(),;<=>[\\]`{}?*'"
+// end-xml-token "/>" +whitespace
+// graphic "!-~"
+// plus-n-space "+" +whitespace
+// punctuation "!-~" -alphanumeric -"_"
+// suffix "-._" +alphanumeric
+// suffix-fmt "%/" +suffix
+// false-type "nNfF0\x00"
+//
+#endif /* 0 -- mapping spec. source */
+
+typedef uint32_t opt_char_cat_mask_t;
+extern opt_char_cat_mask_t const opt_char_cat[128];
+
+static inline int is_opt_char_cat_char(char ch, opt_char_cat_mask_t mask) {
+ unsigned int ix = (unsigned char)ch;
+ return ((ix < 0x7F) && ((opt_char_cat[ix] & mask) != 0)); }
+
+#define IS_LOWER_CASE_CHAR(_c) is_opt_char_cat_char((_c), 0x00001)
+#define IS_UPPER_CASE_CHAR(_c) is_opt_char_cat_char((_c), 0x00002)
+#define IS_ALPHABETIC_CHAR(_c) is_opt_char_cat_char((_c), 0x00003)
+#define IS_OCT_DIGIT_CHAR(_c) is_opt_char_cat_char((_c), 0x00004)
+#define IS_DEC_DIGIT_CHAR(_c) is_opt_char_cat_char((_c), 0x0000C)
+#define IS_HEX_DIGIT_CHAR(_c) is_opt_char_cat_char((_c), 0x0001C)
+#define IS_ALPHANUMERIC_CHAR(_c) is_opt_char_cat_char((_c), 0x0000F)
+#define IS_VAR_FIRST_CHAR(_c) is_opt_char_cat_char((_c), 0x00023)
+#define IS_VARIABLE_NAME_CHAR(_c) is_opt_char_cat_char((_c), 0x0002F)
+#define IS_OPTION_NAME_CHAR(_c) is_opt_char_cat_char((_c), 0x0006F)
+#define IS_VALUE_NAME_CHAR(_c) is_opt_char_cat_char((_c), 0x000EF)
+#define IS_HORIZ_WHITE_CHAR(_c) is_opt_char_cat_char((_c), 0x00100)
+#define IS_COMPOUND_NAME_CHAR(_c) is_opt_char_cat_char((_c), 0x003EF)
+#define IS_WHITESPACE_CHAR(_c) is_opt_char_cat_char((_c), 0x00500)
+#define IS_UNQUOTABLE_CHAR(_c) is_opt_char_cat_char((_c), 0x00800)
+#define IS_END_XML_TOKEN_CHAR(_c) is_opt_char_cat_char((_c), 0x01500)
+#define IS_GRAPHIC_CHAR(_c) is_opt_char_cat_char((_c), 0x02000)
+#define IS_PLUS_N_SPACE_CHAR(_c) is_opt_char_cat_char((_c), 0x04500)
+#define IS_PUNCTUATION_CHAR(_c) is_opt_char_cat_char((_c), 0x08000)
+#define IS_SUFFIX_CHAR(_c) is_opt_char_cat_char((_c), 0x1000F)
+#define IS_SUFFIX_FMT_CHAR(_c) is_opt_char_cat_char((_c), 0x3000F)
+#define IS_FALSE_TYPE_CHAR(_c) is_opt_char_cat_char((_c), 0x40000)
+
+#ifdef AUTOOPTS_INTERNAL
+opt_char_cat_mask_t const opt_char_cat[128] = {
+ /*x00*/ 0x40000, /*x01*/ 0x00000, /*x02*/ 0x00000, /*x03*/ 0x00000,
+ /*x04*/ 0x00000, /*x05*/ 0x00000, /*x06*/ 0x00000, /*\a */ 0x00000,
+ /*\b */ 0x00400, /*\t */ 0x00100, /*\n */ 0x00400, /*\v */ 0x00400,
+ /*\f */ 0x00400, /*\r */ 0x00400, /*x0E*/ 0x00000, /*x0F*/ 0x00000,
+ /*x10*/ 0x00000, /*x11*/ 0x00000, /*x12*/ 0x00000, /*x13*/ 0x00000,
+ /*x14*/ 0x00000, /*x15*/ 0x00000, /*x16*/ 0x00000, /*x17*/ 0x00000,
+ /*x18*/ 0x00000, /*x19*/ 0x00000, /*x1A*/ 0x00000, /*x1B*/ 0x00000,
+ /*x1C*/ 0x00000, /*x1D*/ 0x00000, /*x1E*/ 0x00000, /*x1F*/ 0x00000,
+ /* */ 0x00100, /* ! */ 0x0A800, /* " */ 0x0A000, /* # */ 0x0A000,
+ /* $ */ 0x0A800, /* % */ 0x2A800, /* & */ 0x0A800, /* ' */ 0x0A000,
+ /* ( */ 0x0A000, /* ) */ 0x0A000, /* * */ 0x0A000, /* + */ 0x0E800,
+ /* , */ 0x0A000, /* - */ 0x1A840, /* . */ 0x1AA00, /* / */ 0x2B800,
+ /* 0 */ 0x42804, /* 1 */ 0x02804, /* 2 */ 0x02804, /* 3 */ 0x02804,
+ /* 4 */ 0x02804, /* 5 */ 0x02804, /* 6 */ 0x02804, /* 7 */ 0x02804,
+ /* 8 */ 0x02808, /* 9 */ 0x02808, /* : */ 0x0A880, /* ; */ 0x0A000,
+ /* < */ 0x0A000, /* = */ 0x0A000, /* > */ 0x0B000, /* ? */ 0x0A000,
+ /* @ */ 0x0A800, /* A */ 0x02812, /* B */ 0x02812, /* C */ 0x02812,
+ /* D */ 0x02812, /* E */ 0x02812, /* F */ 0x42812, /* G */ 0x02802,
+ /* H */ 0x02802, /* I */ 0x02802, /* J */ 0x02802, /* K */ 0x02802,
+ /* L */ 0x02802, /* M */ 0x02802, /* N */ 0x42802, /* O */ 0x02802,
+ /* P */ 0x02802, /* Q */ 0x02802, /* R */ 0x02802, /* S */ 0x02802,
+ /* T */ 0x02802, /* U */ 0x02802, /* V */ 0x02802, /* W */ 0x02802,
+ /* X */ 0x02802, /* Y */ 0x02802, /* Z */ 0x02802, /* [ */ 0x0A200,
+ /* \ */ 0x0A000, /* ] */ 0x0A200, /* ^ */ 0x0A840, /* _ */ 0x12820,
+ /* ` */ 0x0A000, /* a */ 0x02811, /* b */ 0x02811, /* c */ 0x02811,
+ /* d */ 0x02811, /* e */ 0x02811, /* f */ 0x42811, /* g */ 0x02801,
+ /* h */ 0x02801, /* i */ 0x02801, /* j */ 0x02801, /* k */ 0x02801,
+ /* l */ 0x02801, /* m */ 0x02801, /* n */ 0x42801, /* o */ 0x02801,
+ /* p */ 0x02801, /* q */ 0x02801, /* r */ 0x02801, /* s */ 0x02801,
+ /* t */ 0x02801, /* u */ 0x02801, /* v */ 0x02801, /* w */ 0x02801,
+ /* x */ 0x02801, /* y */ 0x02801, /* z */ 0x02801, /* { */ 0x0A000,
+ /* | */ 0x0A800, /* } */ 0x0A000, /* ~ */ 0x0A800, /*x7F*/ 0x00000
+};
+#endif /* AUTOOPTS_INTERNAL */
+#endif /* AG_CHAR_MAP_H_GUARD */
/*
- * $Id: autoopts.c,v 4.25 2007/04/15 19:01:18 bkorb Exp $
- * Time-stamp: "2007-04-15 11:10:40 bkorb"
+ * $Id: autoopts.c,v 4.39 2009/01/25 19:31:59 bkorb Exp $
+ * Time-stamp: "2009-01-12 02:49:49 bkorb"
*
* This file contains all of the routines that must be linked into
* an executable to use the generated option processing. The optional
* routines are in separately compiled modules so that they will not
* necessarily be linked in.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
+ * These files have the following md5sums:
*
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
static char const zNil[] = "";
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static tSuccess
findOptDesc( tOptions* pOpts, tOptState* pOptState );
static tSuccess
-nextOption( tOptions* pOpts, tOptState* pOptState );
+next_opt_arg_must(tOptions* pOpts, tOptState* pOptState);
+
+static tSuccess
+next_opt_arg_may(tOptions* pOpts, tOptState* pOptState);
+
+static tSuccess
+next_opt_arg_none(tOptions* pOpts, tOptState* pOptState);
+
+static tSuccess
+nextOption(tOptions* pOpts, tOptState* pOptState);
static tSuccess
doPresets( tOptions* pOpts );
{
char * res = strdup(str);
if (res == NULL) {
- fprintf( stderr, "strdup of %d byte string failed\n", (int)strlen(str) );
+ fprintf(stderr, "strdup of %d byte string failed\n", (int)strlen(str));
exit( EXIT_FAILURE );
}
return res;
int matchCt = 0;
int matchIdx = 0;
int nameLen;
+ char opt_name_buf[128];
/*
* IF the value is attached to the name,
- * THEN clip it off.
- * Either way, figure out how long our name is
+ * copy it off so we can NUL terminate.
*/
if (pzEq != NULL) {
nameLen = (int)(pzEq - pzOptName);
- *pzEq = NUL;
+ if (nameLen >= sizeof(opt_name_buf))
+ return FAILURE;
+ memcpy(opt_name_buf, pzOptName, nameLen);
+ opt_name_buf[nameLen] = NUL;
+ pzOptName = opt_name_buf;
+ pzEq++;
+
} else nameLen = strlen( pzOptName );
do {
} while (pOD++, (++idx < idxLim));
- if (pzEq != NULL)
- *(pzEq++) = '=';
-
/*
* Make sure we either found an exact match or found only one partial
*/
* THEN call the usage procedure.
*/
if ((pOpts->fOptSet & OPTPROC_ERRSTOP) != 0) {
- fprintf( stderr, zIllOptStr, pOpts->pzProgPath,
- (matchCt == 0) ? zIllegal : zAmbiguous, pzOptName );
+ fprintf(stderr, (matchCt == 0) ? zIllOptStr : zAmbigOptStr,
+ pOpts->pzProgPath, pzOptName);
(*pOpts->pUsageProc)( pOpts, EXIT_FAILURE );
}
* THEN the result is the "option" itself and the
* option is the specially marked "number" option.
*/
- if ( isdigit( optValue )
+ if ( IS_DEC_DIGIT_CHAR(optValue)
&& (pOpts->specOptIdx.number_option != NO_EQUIVALENT) ) {
pOptState->pOD = \
pRes = pOpts->pOptDesc + pOpts->specOptIdx.number_option;
* IF all arguments must be named options, ...
*/
if (NAMED_OPTS(pOpts)) {
- char* pz = pOpts->pzCurOpt;
+ char * pz = pOpts->pzCurOpt;
+ int def;
+ tSuccess res;
+ tAoUS * def_opt;
+
pOpts->curOptIdx++;
+ if (*pz != '-')
+ return longOptionFind(pOpts, pz, pOptState);
+
/*
- * Skip over any flag/option markers.
- * In this mode, they are not required.
+ * The name is prefixed with one or more hyphens. Strip them off
+ * and disable the "default_opt" setting. Use heavy recasting to
+ * strip off the "const" quality of the "default_opt" field.
*/
- while (*pz == '-') pz++;
-
- return longOptionFind( pOpts, pz, pOptState );
+ while (*(++pz) == '-') ;
+ def_opt = (void *)&(pOpts->specOptIdx.default_opt);
+ def = *def_opt;
+ *def_opt = NO_EQUIVALENT;
+ res = longOptionFind(pOpts, pz, pOptState);
+ *def_opt = def;
+ return res;
}
/*
}
-/*
- * nextOption
- *
- * Find the option descriptor and option argument (if any) for the
- * next command line argument. DO NOT modify the descriptor. Put
- * all the state in the state argument so that the option can be skipped
- * without consequence (side effect).
- */
static tSuccess
-nextOption( tOptions* pOpts, tOptState* pOptState )
+next_opt_arg_must(tOptions* pOpts, tOptState* pOptState)
{
- tSuccess res;
- enum { ARG_NONE, ARG_MAY, ARG_MUST } arg_type = ARG_NONE;
- teOptArgType at;
-
- res = findOptDesc( pOpts, pOptState );
- if (! SUCCESSFUL( res ))
- return res;
- pOptState->flags |= (pOptState->pOD->fOptState & OPTST_PERSISTENT_MASK);
- at = OPTST_GET_ARGTYPE(pOptState->flags);
-
/*
- * Figure out what to do about option arguments. An argument may be
- * required, not associated with the option, or be optional. We detect the
- * latter by examining for an option marker on the next possible argument.
- * Disabled mode option selection also disables option arguments.
+ * An option argument is required. Long options can either have
+ * a separate command line argument, or an argument attached by
+ * the '=' character. Figure out which.
*/
- if ((pOptState->flags & OPTST_DISABLED) != 0)
- arg_type = ARG_NONE;
- else if (at == OPARG_TYPE_NONE)
- arg_type = ARG_NONE;
- else if (pOptState->flags & OPTST_ARG_OPTIONAL)
- arg_type = ARG_MAY;
- else
- arg_type = ARG_MUST;
-
- switch (arg_type) {
- case ARG_MUST:
+ switch (pOptState->optType) {
+ case TOPT_SHORT:
/*
- * An option argument is required. Long options can either have
- * a separate command line argument, or an argument attached by
- * the '=' character. Figure out which.
+ * See if an arg string follows the flag character
*/
- switch (pOptState->optType) {
- case TOPT_SHORT:
- /*
- * See if an arg string follows the flag character
- */
- if (*++(pOpts->pzCurOpt) == NUL)
- pOpts->pzCurOpt = pOpts->origArgVect[ pOpts->curOptIdx++ ];
- pOptState->pzOptArg = pOpts->pzCurOpt;
- break;
+ if (*++(pOpts->pzCurOpt) == NUL)
+ pOpts->pzCurOpt = pOpts->origArgVect[ pOpts->curOptIdx++ ];
+ pOptState->pzOptArg = pOpts->pzCurOpt;
+ break;
- case TOPT_LONG:
- /*
- * See if an arg string has already been assigned (glued on
- * with an `=' character)
- */
- if (pOptState->pzOptArg == NULL)
- pOptState->pzOptArg = pOpts->origArgVect[ pOpts->curOptIdx++ ];
- break;
+ case TOPT_LONG:
+ /*
+ * See if an arg string has already been assigned (glued on
+ * with an `=' character)
+ */
+ if (pOptState->pzOptArg == NULL)
+ pOptState->pzOptArg = pOpts->origArgVect[ pOpts->curOptIdx++ ];
+ break;
- default:
+ default:
#ifdef DEBUG
- fputs( "AutoOpts lib error: option type not selected\n",
- stderr );
- exit( EXIT_FAILURE );
+ fputs( "AutoOpts lib error: option type not selected\n",
+ stderr );
+ exit( EXIT_FAILURE );
#endif
- case TOPT_DEFAULT:
- /*
- * The option was selected by default. The current token is
- * the option argument.
- */
- break;
- }
-
+ case TOPT_DEFAULT:
/*
- * Make sure we did not overflow the argument list.
+ * The option was selected by default. The current token is
+ * the option argument.
*/
- if (pOpts->curOptIdx > pOpts->origArgCt) {
- fprintf( stderr, zMisArg, pOpts->pzProgPath,
- pOptState->pOD->pz_Name );
- return FAILURE;
- }
-
- pOpts->pzCurOpt = NULL; /* next time advance to next arg */
break;
+ }
- case ARG_MAY:
- /*
- * An option argument is optional.
- */
- switch (pOptState->optType) {
- case TOPT_SHORT:
- if (*++pOpts->pzCurOpt != NUL)
- pOptState->pzOptArg = pOpts->pzCurOpt;
- else {
- char* pzLA = pOpts->origArgVect[ pOpts->curOptIdx ];
-
- /*
- * BECAUSE it is optional, we must make sure
- * we did not find another flag and that there
- * is such an argument.
- */
- if ((pzLA == NULL) || (*pzLA == '-'))
- pOptState->pzOptArg = NULL;
- else {
- pOpts->curOptIdx++; /* argument found */
- pOptState->pzOptArg = pzLA;
- }
- }
- break;
+ /*
+ * Make sure we did not overflow the argument list.
+ */
+ if (pOpts->curOptIdx > pOpts->origArgCt) {
+ fprintf( stderr, zMisArg, pOpts->pzProgPath,
+ pOptState->pOD->pz_Name );
+ return FAILURE;
+ }
+
+ pOpts->pzCurOpt = NULL; /* next time advance to next arg */
+ return SUCCESS;
+}
+
+
+static tSuccess
+next_opt_arg_may(tOptions* pOpts, tOptState* pOptState)
+{
+ /*
+ * An option argument is optional.
+ */
+ switch (pOptState->optType) {
+ case TOPT_SHORT:
+ if (*++pOpts->pzCurOpt != NUL)
+ pOptState->pzOptArg = pOpts->pzCurOpt;
+ else {
+ char* pzLA = pOpts->origArgVect[ pOpts->curOptIdx ];
- case TOPT_LONG:
/*
- * Look for an argument if we don't already have one (glued on
- * with a `=' character) *AND* we are not in named argument mode
+ * BECAUSE it is optional, we must make sure
+ * we did not find another flag and that there
+ * is such an argument.
*/
- if ( (pOptState->pzOptArg == NULL)
- && (! NAMED_OPTS(pOpts))) {
- char* pzLA = pOpts->origArgVect[ pOpts->curOptIdx ];
-
- /*
- * BECAUSE it is optional, we must make sure
- * we did not find another flag and that there
- * is such an argument.
- */
- if ((pzLA == NULL) || (*pzLA == '-'))
- pOptState->pzOptArg = NULL;
- else {
- pOpts->curOptIdx++; /* argument found */
- pOptState->pzOptArg = pzLA;
- }
+ if ((pzLA == NULL) || (*pzLA == '-'))
+ pOptState->pzOptArg = NULL;
+ else {
+ pOpts->curOptIdx++; /* argument found */
+ pOptState->pzOptArg = pzLA;
}
- break;
-
- default:
- case TOPT_DEFAULT:
- fputs( "AutoOpts lib error: defaulted to option with optional arg\n",
- stderr );
- exit( EX_SOFTWARE );
}
-
- /*
- * After an option with an optional argument, we will
- * *always* start with the next option because if there
- * were any characters following the option name/flag,
- * they would be interpreted as the argument.
- */
- pOpts->pzCurOpt = NULL;
break;
- default: /* CANNOT */
+ case TOPT_LONG:
/*
- * No option argument. Make sure next time around we find
- * the correct option flag character for short options
+ * Look for an argument if we don't already have one (glued on
+ * with a `=' character) *AND* we are not in named argument mode
*/
- if (pOptState->optType == TOPT_SHORT)
- (pOpts->pzCurOpt)++;
+ if ( (pOptState->pzOptArg == NULL)
+ && (! NAMED_OPTS(pOpts))) {
+ char* pzLA = pOpts->origArgVect[ pOpts->curOptIdx ];
- /*
- * It is a long option. Make sure there was no ``=xxx'' argument
- */
- else if (pOptState->pzOptArg != NULL) {
- fprintf( stderr, zNoArg, pOpts->pzProgPath,
- pOptState->pOD->pz_Name );
- return FAILURE;
+ /*
+ * BECAUSE it is optional, we must make sure
+ * we did not find another flag and that there
+ * is such an argument.
+ */
+ if ((pzLA == NULL) || (*pzLA == '-'))
+ pOptState->pzOptArg = NULL;
+ else {
+ pOpts->curOptIdx++; /* argument found */
+ pOptState->pzOptArg = pzLA;
+ }
}
+ break;
- /*
- * It is a long option. Advance to next command line argument.
- */
- else
- pOpts->pzCurOpt = NULL;
+ default:
+ case TOPT_DEFAULT:
+ fputs(zAO_Woops, stderr );
+ exit( EX_SOFTWARE );
}
+ /*
+ * After an option with an optional argument, we will
+ * *always* start with the next option because if there
+ * were any characters following the option name/flag,
+ * they would be interpreted as the argument.
+ */
+ pOpts->pzCurOpt = NULL;
return SUCCESS;
}
+static tSuccess
+next_opt_arg_none(tOptions* pOpts, tOptState* pOptState)
+{
+ /*
+ * No option argument. Make sure next time around we find
+ * the correct option flag character for short options
+ */
+ if (pOptState->optType == TOPT_SHORT)
+ (pOpts->pzCurOpt)++;
+
+ /*
+ * It is a long option. Make sure there was no ``=xxx'' argument
+ */
+ else if (pOptState->pzOptArg != NULL) {
+ fprintf(stderr, zNoArg, pOpts->pzProgPath, pOptState->pOD->pz_Name);
+ return FAILURE;
+ }
+
+ /*
+ * It is a long option. Advance to next command line argument.
+ */
+ else
+ pOpts->pzCurOpt = NULL;
+ return SUCCESS;
+}
+
+/*
+ * nextOption
+ *
+ * Find the option descriptor and option argument (if any) for the
+ * next command line argument. DO NOT modify the descriptor. Put
+ * all the state in the state argument so that the option can be skipped
+ * without consequence (side effect).
+ */
+static tSuccess
+nextOption(tOptions* pOpts, tOptState* pOptState)
+{
+ {
+ tSuccess res;
+ res = findOptDesc( pOpts, pOptState );
+ if (! SUCCESSFUL( res ))
+ return res;
+ }
+
+ if ( ((pOptState->flags & OPTST_DEFINED) != 0)
+ && ((pOptState->pOD->fOptState & OPTST_NO_COMMAND) != 0)) {
+ fprintf(stderr, zNotCmdOpt, pOptState->pOD->pz_Name);
+ return FAILURE;
+ }
+
+ pOptState->flags |= (pOptState->pOD->fOptState & OPTST_PERSISTENT_MASK);
+
+ /*
+ * Figure out what to do about option arguments. An argument may be
+ * required, not associated with the option, or be optional. We detect the
+ * latter by examining for an option marker on the next possible argument.
+ * Disabled mode option selection also disables option arguments.
+ */
+ {
+ enum { ARG_NONE, ARG_MAY, ARG_MUST } arg_type = ARG_NONE;
+ tSuccess res;
+
+ if ((pOptState->flags & OPTST_DISABLED) != 0)
+ arg_type = ARG_NONE;
+
+ else if (OPTST_GET_ARGTYPE(pOptState->flags) == OPARG_TYPE_NONE)
+ arg_type = ARG_NONE;
+
+ else if (pOptState->flags & OPTST_ARG_OPTIONAL)
+ arg_type = ARG_MAY;
+
+ else
+ arg_type = ARG_MUST;
+
+ switch (arg_type) {
+ case ARG_MUST: res = next_opt_arg_must(pOpts, pOptState); break;
+ case ARG_MAY: res = next_opt_arg_may( pOpts, pOptState); break;
+ case ARG_NONE: res = next_opt_arg_none(pOpts, pOptState); break;
+ }
+
+ return res;
+ }
+}
+
+
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* DO PRESETS
* has a --load-opts option. See if a command line option has disabled
* option presetting.
*/
- if (pOpts->specOptIdx.save_opts != 0) {
+ if ( (pOpts->specOptIdx.save_opts != NO_EQUIVALENT)
+ && (pOpts->specOptIdx.save_opts != 0)) {
pOD = pOpts->pOptDesc + pOpts->specOptIdx.save_opts + 1;
if (DISABLED_OPT(pOD))
return SUCCESS;
if (! SUCCESSFUL( doPresets( pOpts )))
return 0;
+ /*
+ * IF option name conversion was suppressed but it is not suppressed
+ * for the command line, then it's time to translate option names.
+ * Usage text will not get retranslated.
+ */
+ if ( ((pOpts->fOptSet & OPTPROC_TRANSLATE) != 0)
+ && (pOpts->pTransProc != NULL)
+ && ((pOpts->fOptSet & OPTPROC_NO_XLAT_MASK)
+ == OPTPROC_NXLAT_OPT_CFG) ) {
+
+ pOpts->fOptSet &= ~OPTPROC_NXLAT_OPT_CFG;
+ (*pOpts->pTransProc)();
+ }
+
if ((pOpts->fOptSet & OPTPROC_REORDER) != 0)
optionSort( pOpts );
* THEN do that now before testing for conflicts.
* (conflicts are ignored in preset options)
*/
- if (pOpts->specOptIdx.save_opts != 0) {
+ if ( (pOpts->specOptIdx.save_opts != NO_EQUIVALENT)
+ && (pOpts->specOptIdx.save_opts != 0)) {
tOptDesc* pOD = pOpts->pOptDesc + pOpts->specOptIdx.save_opts;
if (SELECTED_OPT( pOD )) {
/*
- * Time-stamp: "2007-04-15 09:59:39 bkorb"
+ * Time-stamp: "2008-11-01 20:08:06 bkorb"
*
- * autoopts.h $Id: autoopts.h,v 4.23 2007/04/15 19:01:18 bkorb Exp $
- * Time-stamp: "2005-02-14 05:59:50 bkorb"
+ * autoopts.h $Id: autoopts.h,v 4.30 2009/01/01 16:51:47 bkorb Exp $
*
* This file defines all the global structures and special values
* used in the automated option processing library.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
*
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * Automated Options 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.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * These files have the following md5sums:
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
- *
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
#ifndef AUTOGEN_AUTOOPTS_H
#define AUTOGEN_AUTOOPTS_H
#include "compat/compat.h"
+#include "ag-char-map.h"
#define AO_NAME_LIMIT 127
#define AO_NAME_SIZE ((size_t)(AO_NAME_LIMIT + 1))
#define PROCESSING(d) ((d)>0)
#define PRESETTING(d) ((d)<0)
-#define ISNAMECHAR( c ) (isalnum(c) || ((c) == '_') || ((c) == '-'))
-
/*
* Procedure success codes
*
tCC* pzStr;
tCC* pzReq;
tCC* pzNum;
+ tCC* pzFile;
tCC* pzKey;
tCC* pzKeyL;
tCC* pzBool;
tCC* pzNoF;
tCC* pzSpc;
tCC* pzOptFmt;
+ tCC* pzTime;
} arg_types_t;
#define AGALOC( c, w ) ao_malloc((size_t)c)
#define AGREALOC( p, c, w ) ao_realloc((void*)p, (size_t)c)
-#define AGFREE( p ) ao_free((void*)p)
+#define AGFREE(_p) do{void*X=(void*)_p;ao_free(X);}while(0)
#define AGDUPSTR( p, s, w ) (p = ao_strdup(s))
static void *
*
* DO NOT EDIT THIS FILE (options.h)
*
- * It has been AutoGen-ed Saturday May 5, 2007 at 12:02:34 PM PDT
+ * It has been AutoGen-ed Saturday May 16, 2009 at 08:15:53 AM PDT
* From the definitions funcs.def
* and the template file options_h
*
*
* Automated Options copyright 1992-Y Bruce Korb
*
- * AutoOpts is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
+ * AutoOpts is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
*
- * AutoOpts 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
- * Lesser General Public License for more details.
+ * AutoOpts 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 Lesser General Public License for more details.
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with AutoOpts. If not, write to:
- * The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301, USA.
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef AUTOOPTS_OPTIONS_H_GUARD
-#define AUTOOPTS_OPTIONS_H_GUARD
+#define AUTOOPTS_OPTIONS_H_GUARD 1
#include <sys/types.h>
+#include <stdio.h>
#if defined(HAVE_STDINT_H)
# include <stdint.h>
* values for "opt_name" are available.
*/
-#define OPTIONS_STRUCT_VERSION 118784
-#define OPTIONS_VERSION_STRING "29:0:4"
+#define OPTIONS_STRUCT_VERSION 131073
+#define OPTIONS_VERSION_STRING "32:1:7"
#define OPTIONS_MINIMUM_VERSION 102400
#define OPTIONS_MIN_VER_STRING "25:0:0"
OPARG_TYPE_BOOLEAN = 3, /* opt arg is boolean-valued */
OPARG_TYPE_MEMBERSHIP = 4, /* opt arg sets set membership bits */
OPARG_TYPE_NUMERIC = 5, /* opt arg has numeric value */
- OPARG_TYPE_HIERARCHY = 6 /* option arg is hierarchical value */
+ OPARG_TYPE_HIERARCHY = 6, /* option arg is hierarchical value */
+ OPARG_TYPE_FILE = 7, /* option arg names a file */
+ OPARG_TYPE_TIME = 8 /* opt arg is a time duration */
} teOptArgType;
typedef struct optionValue {
} v;
} tOptionValue;
+typedef enum {
+ FTYPE_MODE_MAY_EXIST = 0x00,
+ FTYPE_MODE_MUST_EXIST = 0x01,
+ FTYPE_MODE_MUST_NOT_EXIST = 0x02,
+ FTYPE_MODE_EXIST_MASK = 0x03,
+ FTYPE_MODE_NO_OPEN = 0x00,
+ FTYPE_MODE_OPEN_FD = 0x10,
+ FTYPE_MODE_FOPEN_FP = 0x20,
+ FTYPE_MODE_OPEN_MASK = 0x30
+} teOptFileType;
+
+typedef union {
+ int file_flags;
+ char const * file_mode;
+} tuFileMode;
+
/*
* Bits in the fOptState option descriptor field.
*/
OPTST_SET_ID = 0, /* Set via the "SET_OPT()" macro */
OPTST_PRESET_ID = 1, /* Set via an RC/INI file */
OPTST_DEFINED_ID = 2, /* Set via a command line option */
+ OPTST_RESET_ID = 3, /* Reset via command line option */
OPTST_EQUIVALENCE_ID = 4, /* selected by equiv'ed option */
OPTST_DISABLED_ID = 5, /* option is in disabled state */
OPTST_ALLOC_ARG_ID = 6, /* pzOptArg was allocated */
OPTST_MUST_SET_ID = 20, /* must be set or pre-set */
OPTST_DOCUMENT_ID = 21, /* opt is for doc only */
OPTST_TWICE_ID = 22, /* process opt twice - imm + reg */
- OPTST_DISABLE_TWICE_ID = 23 /* process disabled option twice */
+ OPTST_DISABLE_TWICE_ID = 23, /* process disabled option twice */
+ OPTST_SCALED_NUM_ID = 24, /* scaled integer value */
+ OPTST_NO_COMMAND_ID = 25, /* disable from cmd line */
+ OPTST_DEPRECATED_ID = 26 /* support is being removed */
} opt_state_enum_t;
#define OPTST_INIT 0U
#define OPTST_SET (1U << OPTST_SET_ID)
#define OPTST_PRESET (1U << OPTST_PRESET_ID)
#define OPTST_DEFINED (1U << OPTST_DEFINED_ID)
+#define OPTST_RESET (1U << OPTST_RESET_ID)
#define OPTST_EQUIVALENCE (1U << OPTST_EQUIVALENCE_ID)
#define OPTST_DISABLED (1U << OPTST_DISABLED_ID)
#define OPTST_ALLOC_ARG (1U << OPTST_ALLOC_ARG_ID)
#define OPTST_DOCUMENT (1U << OPTST_DOCUMENT_ID)
#define OPTST_TWICE (1U << OPTST_TWICE_ID)
#define OPTST_DISABLE_TWICE (1U << OPTST_DISABLE_TWICE_ID)
-#define OPT_STATE_MASK 0x00FFFF77U
+#define OPTST_SCALED_NUM (1U << OPTST_SCALED_NUM_ID)
+#define OPTST_NO_COMMAND (1U << OPTST_NO_COMMAND_ID)
+#define OPTST_DEPRECATED (1U << OPTST_DEPRECATED_ID)
+#define OPT_STATE_MASK 0x07FFFF7FU
#define OPTST_SET_MASK ( \
OPTST_SET | \
OPTST_PRESET | \
+ OPTST_RESET | \
OPTST_DEFINED )
#define OPTST_MUTABLE_MASK ( \
OPTST_SET | \
OPTST_PRESET | \
+ OPTST_RESET | \
OPTST_DEFINED | \
OPTST_EQUIVALENCE | \
OPTST_DISABLED | \
OPTST_ARG_TYPE_3 | \
OPTST_ARG_TYPE_4 )
+#define OPTST_DO_NOT_SAVE_MASK ( \
+ OPTST_NO_INIT | \
+ OPTST_DOCUMENT | \
+ OPTST_OMITTED )
+
+#define OPTST_NO_USAGE_MASK ( \
+ OPTST_OMITTED | \
+ OPTST_NO_COMMAND | \
+ OPTST_DEPRECATED )
+
#ifdef NO_OPTIONAL_OPT_ARGS
# undef OPTST_ARG_OPTIONAL
# define OPTST_ARG_OPTIONAL 0
#define OPTST_PERSISTENT_MASK (~OPTST_MUTABLE_MASK)
-#define SELECTED_OPT( pod ) ((pod)->fOptState & OPTST_SELECTED_MASK)
-#define UNUSED_OPT( pod ) (((pod)->fOptState & OPTST_SET_MASK) == 0)
-#define DISABLED_OPT( pod ) ((pod)->fOptState & OPTST_DISABLED)
-#define OPTION_STATE( pod ) ((pod)->fOptState)
-
-#define OPTST_SET_ARGTYPE(n) ((n) << OPTST_ARG_TYPE_1_ID)
-#define OPTST_GET_ARGTYPE(f) (((f) & OPTST_ARG_TYPE_MASK)>>OPTST_ARG_TYPE_1_ID)
+#define SELECTED_OPT(_od) ((_od)->fOptState & OPTST_SELECTED_MASK)
+#define UNUSED_OPT( _od) (((_od)->fOptState & OPTST_SET_MASK) == 0)
+#define DISABLED_OPT(_od) ((_od)->fOptState & OPTST_DISABLED)
+#define OPTION_STATE(_od) ((_od)->fOptState)
+#define OPTST_SET_ARGTYPE(_n) ((_n) << OPTST_ARG_TYPE_1_ID)
+#define OPTST_GET_ARGTYPE(_f) (((_f)&OPTST_ARG_TYPE_MASK)>>OPTST_ARG_TYPE_1_ID)
/*
* PRIVATE INTERFACES
* Define the processing state flags
*/
typedef enum {
- OPTPROC_LONGOPT_ID = 0, /* Process long style options */
- OPTPROC_SHORTOPT_ID = 1, /* Process short style "flags" */
- OPTPROC_ERRSTOP_ID = 2, /* Stop on argument errors */
- OPTPROC_DISABLEDOPT_ID = 3, /* Current option is disabled */
- OPTPROC_NO_REQ_OPT_ID = 4, /* no options are required */
- OPTPROC_NUM_OPT_ID = 5, /* there is a number option */
- OPTPROC_INITDONE_ID = 6, /* have initializations been done? */
- OPTPROC_NEGATIONS_ID = 7, /* any negation options? */
- OPTPROC_ENVIRON_ID = 8, /* check environment? */
- OPTPROC_NO_ARGS_ID = 9, /* Disallow remaining arguments */
- OPTPROC_ARGS_REQ_ID = 10, /* Require arguments after options */
- OPTPROC_REORDER_ID = 11, /* reorder operands after options */
- OPTPROC_GNUUSAGE_ID = 12, /* emit usage in GNU style */
- OPTPROC_TRANSLATE_ID = 13, /* Translate strings in tOptions */
- OPTPROC_HAS_IMMED_ID = 14, /* program defines immed options */
- OPTPROC_PRESETTING_ID = 19 /* opt processing in preset state */
+ OPTPROC_LONGOPT_ID = 0, /* Process long style options */
+ OPTPROC_SHORTOPT_ID = 1, /* Process short style "flags" */
+ OPTPROC_ERRSTOP_ID = 2, /* Stop on argument errors */
+ OPTPROC_DISABLEDOPT_ID = 3, /* Current option is disabled */
+ OPTPROC_NO_REQ_OPT_ID = 4, /* no options are required */
+ OPTPROC_NUM_OPT_ID = 5, /* there is a number option */
+ OPTPROC_INITDONE_ID = 6, /* have inits been done? */
+ OPTPROC_NEGATIONS_ID = 7, /* any negation options? */
+ OPTPROC_ENVIRON_ID = 8, /* check environment? */
+ OPTPROC_NO_ARGS_ID = 9, /* Disallow remaining arguments */
+ OPTPROC_ARGS_REQ_ID = 10, /* Require args after options */
+ OPTPROC_REORDER_ID = 11, /* reorder operands after opts */
+ OPTPROC_GNUUSAGE_ID = 12, /* emit usage in GNU style */
+ OPTPROC_TRANSLATE_ID = 13, /* Translate strings in tOptions */
+ OPTPROC_NXLAT_OPT_CFG_ID = 16, /* suppress for config only */
+ OPTPROC_NXLAT_OPT_ID = 17, /* suppress xlation always */
+ OPTPROC_PRESETTING_ID = 19 /* opt processing in preset state */
} optproc_state_enum_t;
-#define OPTPROC_NONE 0U
-#define OPTPROC_LONGOPT (1U << OPTPROC_LONGOPT_ID)
-#define OPTPROC_SHORTOPT (1U << OPTPROC_SHORTOPT_ID)
-#define OPTPROC_ERRSTOP (1U << OPTPROC_ERRSTOP_ID)
-#define OPTPROC_DISABLEDOPT (1U << OPTPROC_DISABLEDOPT_ID)
-#define OPTPROC_NO_REQ_OPT (1U << OPTPROC_NO_REQ_OPT_ID)
-#define OPTPROC_NUM_OPT (1U << OPTPROC_NUM_OPT_ID)
-#define OPTPROC_INITDONE (1U << OPTPROC_INITDONE_ID)
-#define OPTPROC_NEGATIONS (1U << OPTPROC_NEGATIONS_ID)
-#define OPTPROC_ENVIRON (1U << OPTPROC_ENVIRON_ID)
-#define OPTPROC_NO_ARGS (1U << OPTPROC_NO_ARGS_ID)
-#define OPTPROC_ARGS_REQ (1U << OPTPROC_ARGS_REQ_ID)
-#define OPTPROC_REORDER (1U << OPTPROC_REORDER_ID)
-#define OPTPROC_GNUUSAGE (1U << OPTPROC_GNUUSAGE_ID)
-#define OPTPROC_TRANSLATE (1U << OPTPROC_TRANSLATE_ID)
-#define OPTPROC_HAS_IMMED (1U << OPTPROC_HAS_IMMED_ID)
-#define OPTPROC_PRESETTING (1U << OPTPROC_PRESETTING_ID)
-#define OPTPROC_STATE_MASK 0x00087FFFU
+#define OPTPROC_NONE 0U
+#define OPTPROC_LONGOPT (1U << OPTPROC_LONGOPT_ID)
+#define OPTPROC_SHORTOPT (1U << OPTPROC_SHORTOPT_ID)
+#define OPTPROC_ERRSTOP (1U << OPTPROC_ERRSTOP_ID)
+#define OPTPROC_DISABLEDOPT (1U << OPTPROC_DISABLEDOPT_ID)
+#define OPTPROC_NO_REQ_OPT (1U << OPTPROC_NO_REQ_OPT_ID)
+#define OPTPROC_NUM_OPT (1U << OPTPROC_NUM_OPT_ID)
+#define OPTPROC_INITDONE (1U << OPTPROC_INITDONE_ID)
+#define OPTPROC_NEGATIONS (1U << OPTPROC_NEGATIONS_ID)
+#define OPTPROC_ENVIRON (1U << OPTPROC_ENVIRON_ID)
+#define OPTPROC_NO_ARGS (1U << OPTPROC_NO_ARGS_ID)
+#define OPTPROC_ARGS_REQ (1U << OPTPROC_ARGS_REQ_ID)
+#define OPTPROC_REORDER (1U << OPTPROC_REORDER_ID)
+#define OPTPROC_GNUUSAGE (1U << OPTPROC_GNUUSAGE_ID)
+#define OPTPROC_TRANSLATE (1U << OPTPROC_TRANSLATE_ID)
+#define OPTPROC_NXLAT_OPT_CFG (1U << OPTPROC_NXLAT_OPT_CFG_ID)
+#define OPTPROC_NXLAT_OPT (1U << OPTPROC_NXLAT_OPT_ID)
+#define OPTPROC_PRESETTING (1U << OPTPROC_PRESETTING_ID)
+#define OPTPROC_STATE_MASK 0x000B3FFFU
+
+#define OPTPROC_NO_XLAT_MASK ( \
+ OPTPROC_NXLAT_OPT_CFG | \
+ OPTPROC_NXLAT_OPT )
#define STMTS(s) do { s; } while (0)
typedef struct options tOptions;
typedef struct optDesc tOptDesc;
typedef struct optNames tOptNames;
+#define OPTPROC_EMIT_USAGE ((tOptions *)0x01UL)
+#define OPTPROC_EMIT_SHELL ((tOptions *)0x02UL)
+#define OPTPROC_RETURN_VALNAME ((tOptions *)0x03UL)
+#define OPTPROC_EMIT_LIMIT ((tOptions *)0x0FUL)
/*
* The option procedures do the special processing for each
* option flag that needs it.
*/
-typedef void (tOptProc)( tOptions* pOpts, tOptDesc* pOptDesc );
+typedef void (tOptProc)(tOptions* pOpts, tOptDesc* pOptDesc);
typedef tOptProc* tpOptProc;
/*
* The usage procedure will never return. It calls "exit(2)"
* with the "exitCode" argument passed to it.
*/
-typedef void (tUsageProc)( tOptions* pOpts, int exitCode );
+typedef void (tUsageProc)(tOptions* pOpts, int exitCode);
typedef tUsageProc* tpUsageProc;
/*
long argInt;
unsigned long argUint;
unsigned int argBool;
+ FILE* argFp;
+ int argFd;
} optArgBucket_t;
/*
# define pzLastArg optArg.argString
void* optCookie; /* PUBLIC */
- const int * pOptMust;
- const int * pOptCant;
- tpOptProc pOptProc;
- char const* pzText;
+ int const * const pOptMust;
+ int const * const pOptCant;
+ tpOptProc const pOptProc;
+ char const* const pzText;
- char const* pz_NAME;
- char const* pz_Name;
- char const* pz_DisableName;
- char const* pz_DisablePfx;
+ char const* const pz_NAME;
+ char const* const pz_Name;
+ char const* const pz_DisableName;
+ char const* const pz_DisablePfx;
};
/*
unsigned int curOptIdx;
char* pzCurOpt;
- char const* pzProgPath;
- char const* pzProgName;
- char const* const pzPROGNAME;
- char const* const pzRcName;
- char const* const pzCopyright;
- char const* const pzCopyNotice;
- char const* const pzFullVersion;
+ char const* pzProgPath; /* PUBLIC */
+ char const* pzProgName; /* PUBLIC */
+ char const* const pzPROGNAME; /* PUBLIC */
+ char const* const pzRcName; /* PUBLIC */
+ char const* const pzCopyright; /* PUBLIC */
+ char const* const pzCopyNotice; /* PUBLIC */
+ char const* const pzFullVersion; /* PUBLIC */
char const* const* const papzHomeList;
char const* const pzUsageTitle;
char const* const pzExplain;
char const* const pzDetail;
- tOptDesc* const pOptDesc;
- char const* const pzBugAddr;
+ tOptDesc* const pOptDesc; /* PUBLIC */
+ char const* const pzBugAddr; /* PUBLIC */
void* pExtensions;
void* pSavedState;
tOptSpecIndex specOptIdx;
int const optCt;
int const presetOptCt;
+ char const * pzFullUsage;
+ char const * pzShortUsage;
+ /* PUBLIC: */
+ optArgBucket_t const * const originalOptArgArray;
+ void * const * const originalOptArgCookie;
};
+/*
+ * Versions where in various fields first appear:
+ * ($AO_CURRENT * 4096 + $AO_REVISION, but $AO_REVISION must be zero)
+ */
+#define originalOptArgArray_STRUCT_VERSION 131072 /* AO_CURRENT = 32 */
+#define HAS_originalOptArgArray(_opt) \
+ ((_opt)->structVersion >= originalOptArgArray_STRUCT_VERSION)
+
/*
* "token list" structure returned by "string_tokenize()"
*/
* The following routines may be coded into AutoOpts client code:
*/
-/* From: tokenize.c line 115
+/* From: tokenize.c line 117
*
* ao_string_tokenize - tokenize an input string
*
* Double quote strings are formed according to the rules of string
* constants in ANSI-C programs.
*/
-extern token_list_t* ao_string_tokenize( char const* );
+extern token_list_t* ao_string_tokenize(char const*);
-/* From: configfile.c line 113
+/* From: configfile.c line 85
*
* configFileLoad - parse a configuration file
*
* @code{optionGetValue()}, @code{optionNextValue()} and
* @code{optionUnloadNested()}.
*/
-extern const tOptionValue* configFileLoad( char const* );
+extern const tOptionValue* configFileLoad(char const*);
-/* From: configfile.c line 883
+/* From: configfile.c line 897
*
* optionFileLoad - Load the locatable config files, in order
*
*
* Configuration files not found or not decipherable are simply ignored.
*/
-extern int optionFileLoad( tOptions*, char const* );
+extern int optionFileLoad(tOptions*, char const*);
-/* From: configfile.c line 245
+/* From: configfile.c line 217
*
* optionFindNextValue - find a hierarcicaly valued option instance
*
* configurable. It will search through the list and return the next entry
* that matches the criteria.
*/
-extern const tOptionValue* optionFindNextValue( const tOptDesc*, const tOptionValue*, char const*, char const* );
+extern const tOptionValue* optionFindNextValue(const tOptDesc*, const tOptionValue*, char const*, char const*);
-/* From: configfile.c line 171
+/* From: configfile.c line 143
*
* optionFindValue - find a hierarcicaly valued option instance
*
* This routine will find an entry in a nested value option or configurable.
* It will search through the list and return a matching entry.
*/
-extern const tOptionValue* optionFindValue( const tOptDesc*, char const*, char const* );
+extern const tOptionValue* optionFindValue(const tOptDesc*, char const*, char const*);
-/* From: restore.c line 188
+/* From: restore.c line 165
*
* optionFree - free allocated option processing memory
*
* AutoOpts sometimes allocates memory and puts pointers to it in the
* option state structures. This routine deallocates all such memory.
*/
-extern void optionFree( tOptions* );
+extern void optionFree(tOptions*);
-/* From: configfile.c line 314
+/* From: configfile.c line 286
*
* optionGetValue - get a specific value from a hierarcical list
*
* the first entry with a name that exactly matches the argument will be
* returned.
*/
-extern const tOptionValue* optionGetValue( const tOptionValue*, char const* );
+extern const tOptionValue* optionGetValue(const tOptionValue*, char const*);
-/* From: load.c line 521
+/* From: load.c line 498
*
* optionLoadLine - process a string for an option name and value
*
* formation used in AutoGen definition files (@pxref{basic expression}),
* except that you may not use backquotes.
*/
-extern void optionLoadLine( tOptions*, char const* );
+extern void optionLoadLine(tOptions*, char const*);
-/* From: configfile.c line 373
+/* From: configfile.c line 345
*
* optionNextValue - get the next value from a hierarchical list
*
* The "@var{pOldValue}" must have been gotten from a prior call to this
* routine or to "@code{opitonGetValue()}".
*/
-extern const tOptionValue* optionNextValue( const tOptionValue*, const tOptionValue* );
+extern const tOptionValue* optionNextValue(const tOptionValue*, const tOptionValue*);
-/* From: usage.c line 128
+/* From: usage.c line 107
*
* optionOnlyUsage - Print usage text for just the options
*
* This function may be used when the emitted usage must incorporate
* information not available to AutoOpts.
*/
-extern void optionOnlyUsage( tOptions*, int );
+extern void optionOnlyUsage(tOptions*, int);
-/* From: autoopts.c line 1012
+/* From: autoopts.c line 1041
*
* optionProcess - this is the main option processing routine
*
* is treated as an operand. Encountering an operand stops option
* processing.
*/
-extern int optionProcess( tOptions*, int, char** );
+extern int optionProcess(tOptions*, int, char**);
-/* From: restore.c line 145
+/* From: restore.c line 122
*
* optionRestore - restore option state from memory copy
*
* to optionProcess(3AO), then you may change the contents of the
* argc/argv parameters to optionProcess.
*/
-extern void optionRestore( tOptions* );
+extern void optionRestore(tOptions*);
-/* From: save.c line 334
+/* From: save.c line 670
*
* optionSaveFile - saves the option state to a file
*
* @code{homerc} attribute. If no @code{rcfile} attribute was specified, it
* will default to @code{.@i{programname}rc}. If you wish to specify another
* file, you should invoke the @code{SET_OPT_SAVE_OPTS( @i{filename} )} macro.
+ *
+ * The recommend usage is as follows:
+ * @example
+ * optionProcess(&progOptions, argc, argv);
+ * if (i_want_a_non_standard_place_for_this)
+ * SET_OPT_SAVE_OPTS("myfilename");
+ * optionSaveFile(&progOptions);
+ * @end example
*/
-extern void optionSaveFile( tOptions* );
+extern void optionSaveFile(tOptions*);
-/* From: restore.c line 93
+/* From: restore.c line 70
*
* optionSaveState - saves the option state to memory
*
* restoring of stacked string arguments and hierarchical values is
* disabled. The values are not saved.
*/
-extern void optionSaveState( tOptions* );
+extern void optionSaveState(tOptions*);
-/* From: nested.c line 559
+/* From: nested.c line 569
*
* optionUnloadNested - Deallocate the memory for a nested value
*
* have been gotten from a call to @code{configFileLoad()} (See
* @pxref{libopts-configFileLoad}).
*/
-extern void optionUnloadNested( tOptionValue const * );
+extern void optionUnloadNested(tOptionValue const *);
-/* From: version.c line 58
+/* From: version.c line 37
*
* optionVersion - return the compiled AutoOpts version number
*
* Returns the full version string compiled into the library.
* The returned string cannot be modified.
*/
-extern char const* optionVersion( void );
+extern char const* optionVersion(void);
-/* From: ../compat/pathfind.c line 34
+/* From: ../compat/pathfind.c line 33
*
* pathfind - fild a file in a list of directories
*
* @end example
*/
#ifndef HAVE_PATHFIND
-extern char* pathfind( char const*, char const*, char const* );
+extern char* pathfind(char const*, char const*, char const*);
#endif /* HAVE_PATHFIND */
-/* From: streqvcmp.c line 233
+/* From: streqvcmp.c line 208
*
* strequate - map a list of characters to the same value
*
* This function name is mapped to option_strequate so as to not conflict
* with the POSIX name space.
*/
-extern void strequate( char const* );
+extern void strequate(char const*);
-/* From: streqvcmp.c line 143
+/* From: streqvcmp.c line 118
*
* streqvcmp - compare two strings with an equivalence mapping
*
* This function name is mapped to option_streqvcmp so as to not conflict
* with the POSIX name space.
*/
-extern int streqvcmp( char const*, char const* );
+extern int streqvcmp(char const*, char const*);
-/* From: streqvcmp.c line 180
+/* From: streqvcmp.c line 155
*
* streqvmap - Set the character mappings for the streqv functions
*
* This function name is mapped to option_streqvmap so as to not conflict
* with the POSIX name space.
*/
-extern void streqvmap( char, char, int );
+extern void streqvmap(char, char, int);
-/* From: streqvcmp.c line 102
+/* From: streqvcmp.c line 77
*
* strneqvcmp - compare two strings with an equivalence mapping
*
* This function name is mapped to option_strneqvcmp so as to not conflict
* with the POSIX name space.
*/
-extern int strneqvcmp( char const*, char const*, int );
+extern int strneqvcmp(char const*, char const*, int);
-/* From: streqvcmp.c line 259
+/* From: streqvcmp.c line 234
*
* strtransform - convert a string into its mapped-to value
*
* character is put into the output.
* This function name is mapped to option_strtransform so as to not conflict
* with the POSIX name space.
+ *
+ * The source and destination may be the same.
*/
-extern void strtransform( char*, char const* );
+extern void strtransform(char*, char const*);
/* AutoOpts PRIVATE FUNCTIONS: */
tOptProc optionStackArg, optionUnstackArg, optionBooleanVal, optionNumericVal;
-extern char* ao_string_cook( char*, int* );
+extern char* ao_string_cook(char*, int*);
+
+extern unsigned int ao_string_cook_escape_char(char const*, char*, unsigned int);
+
+extern void export_options_to_guile(tOptions*);
+
+extern void genshelloptUsage(tOptions*, int);
+
+extern void optionBooleanVal(tOptions*, tOptDesc*);
-extern unsigned int ao_string_cook_escape_char( char const*, char*, unsigned int );
+extern uintptr_t optionEnumerationVal(tOptions*, tOptDesc*, char const * const *, unsigned int);
-extern void export_options_to_guile( tOptions* );
+extern void optionFileCheck(tOptions*, tOptDesc*, teOptFileType, tuFileMode);
-extern void genshelloptUsage( tOptions*, int );
+extern char const* optionKeywordName(tOptDesc*, unsigned int);
-extern void optionBooleanVal( tOptions*, tOptDesc* );
+extern void optionLoadOpt(tOptions*, tOptDesc*);
-extern uintptr_t optionEnumerationVal( tOptions*, tOptDesc*, char const * const *, unsigned int );
+extern ag_bool optionMakePath(char*, int, char const*, char const*);
-extern char const* optionKeywordName( tOptDesc*, unsigned int );
+extern void optionNestedVal(tOptions*, tOptDesc*);
-extern void optionLoadOpt( tOptions*, tOptDesc* );
+extern void optionNumericVal(tOptions*, tOptDesc*);
-extern ag_bool optionMakePath( char*, int, char const*, char const* );
+extern void optionPagedUsage(tOptions*, tOptDesc*);
-extern void optionNestedVal( tOptions*, tOptDesc* );
+extern void optionParseShell(tOptions*);
-extern void optionNumericVal( tOptions*, tOptDesc* );
+extern void optionPrintVersion(tOptions*, tOptDesc*);
-extern void optionPagedUsage( tOptions*, tOptDesc* );
+extern void optionPutShell(tOptions*);
-extern void optionParseShell( tOptions* );
+extern void optionResetOpt(tOptions*, tOptDesc*);
-extern void optionPrintVersion( tOptions*, tOptDesc* );
+extern void optionSetMembers(tOptions*, tOptDesc*, char const * const *, unsigned int);
-extern void optionPutShell( tOptions* );
+extern void optionShowRange(tOptions*, tOptDesc*, void *, int);
-extern void optionSetMembers( tOptions*, tOptDesc*, char const * const *, unsigned int );
+extern void optionStackArg(tOptions*, tOptDesc*);
-extern void optionStackArg( tOptions*, tOptDesc* );
+extern void optionTimeVal(tOptions*, tOptDesc*);
-extern void optionUnstackArg( tOptions*, tOptDesc* );
+extern void optionUnstackArg(tOptions*, tOptDesc*);
-extern void optionUsage( tOptions*, int );
+extern void optionUsage(tOptions*, int);
-extern void optionVersionStderr( tOptions*, tOptDesc* );
+extern void optionVersionStderr(tOptions*, tOptDesc*);
-extern void* text_mmap( char const*, int, int, tmap_info_t* );
+extern void* text_mmap(char const*, int, int, tmap_info_t*);
-extern int text_munmap( tmap_info_t* );
+extern int text_munmap(tmap_info_t*);
CPLUSPLUS_CLOSER
#endif /* AUTOOPTS_OPTIONS_H_GUARD */
*
* DO NOT EDIT THIS FILE (usage-txt.h)
*
- * It has been AutoGen-ed Saturday May 5, 2007 at 12:02:33 PM PDT
+ * It has been AutoGen-ed Saturday May 16, 2009 at 08:15:52 AM PDT
* From the definitions usage-txt.def
* and the template file usage-txt.tpl
*
* This file handles all the bookkeeping required for tracking all the little
- * tiny strings used by the AutoOpts library. There are 113
+ * tiny strings used by the AutoOpts library. There are 130
* of them. This is not versioned because it is entirely internal to the
* library and accessed by client code only in a very well-controlled way:
* they may substitute translated strings using a procedure that steps through
* all the string pointers.
*
- * AutoOpts is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
+ * AutoOpts is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
*
- * AutoOpts 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
- * Lesser General Public License for more details.
+ * AutoOpts 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 Lesser General Public License for more details.
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with AutoOpts. If not, write to:
- * The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301, USA.
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef AUTOOPTS_USAGE_TXT_H_GUARD
-#define AUTOOPTS_USAGE_TXT_H_GUARD
+#define AUTOOPTS_USAGE_TXT_H_GUARD 1
#undef cch_t
#define cch_t char const
int field_ct;
char* utpz_GnuBoolArg;
char* utpz_GnuKeyArg;
+ char* utpz_GnuFileArg;
char* utpz_GnuKeyLArg;
+ char* utpz_GnuTimeArg;
char* utpz_GnuNumArg;
char* utpz_GnuStrArg;
- cch_t* apz_str[ 108 ];
+ cch_t* apz_str[ 123 ];
} usage_text_t;
/*
#define zAO_Big (option_usage_text.apz_str[ 1])
#define zAO_Err (option_usage_text.apz_str[ 2])
#define zAO_Sml (option_usage_text.apz_str[ 3])
-#define zAll (option_usage_text.apz_str[ 4])
-#define zAlt (option_usage_text.apz_str[ 5])
-#define zAmbigKey (option_usage_text.apz_str[ 6])
-#define zAmbiguous (option_usage_text.apz_str[ 7])
-#define zArgsMust (option_usage_text.apz_str[ 8])
-#define zAtMost (option_usage_text.apz_str[ 9])
-#define zAuto (option_usage_text.apz_str[ 10])
-#define zBadPipe (option_usage_text.apz_str[ 11])
-#define zBadVerArg (option_usage_text.apz_str[ 12])
-#define zCantFmt (option_usage_text.apz_str[ 13])
-#define zCantSave (option_usage_text.apz_str[ 14])
-#define zDefaultOpt (option_usage_text.apz_str[ 15])
-#define zDis (option_usage_text.apz_str[ 16])
-#define zEnab (option_usage_text.apz_str[ 17])
-#define zEquiv (option_usage_text.apz_str[ 18])
-#define zErrOnly (option_usage_text.apz_str[ 19])
-#define zExamineFmt (option_usage_text.apz_str[ 20])
-#define zFiveSpaces (option_usage_text.apz_str[ 21])
-#define zFlagOkay (option_usage_text.apz_str[ 22])
-#define zFmtFmt (option_usage_text.apz_str[ 23])
-#define zForkFail (option_usage_text.apz_str[ 24])
-#define zFSErrOptLoad (option_usage_text.apz_str[ 25])
-#define zFSErrReadFile (option_usage_text.apz_str[ 26])
-#define zGenshell (option_usage_text.apz_str[ 27])
+#define zAO_Ver (option_usage_text.apz_str[ 4])
+#define zAO_Woops (option_usage_text.apz_str[ 5])
+#define zAll (option_usage_text.apz_str[ 6])
+#define zAlt (option_usage_text.apz_str[ 7])
+#define zAmbigKey (option_usage_text.apz_str[ 8])
+#define zAmbigOptStr (option_usage_text.apz_str[ 9])
+#define zArgsMust (option_usage_text.apz_str[ 10])
+#define zAtMost (option_usage_text.apz_str[ 11])
+#define zAuto (option_usage_text.apz_str[ 12])
+#define zBadPipe (option_usage_text.apz_str[ 13])
+#define zBadVerArg (option_usage_text.apz_str[ 14])
+#define zCantFmt (option_usage_text.apz_str[ 15])
+#define zCantSave (option_usage_text.apz_str[ 16])
+#define zDefaultOpt (option_usage_text.apz_str[ 17])
+#define zDis (option_usage_text.apz_str[ 18])
+#define zEnab (option_usage_text.apz_str[ 19])
+#define zEquiv (option_usage_text.apz_str[ 20])
+#define zErrOnly (option_usage_text.apz_str[ 21])
+#define zExamineFmt (option_usage_text.apz_str[ 22])
+#define zFiveSpaces (option_usage_text.apz_str[ 23])
+#define zFlagOkay (option_usage_text.apz_str[ 24])
+#define zFmtFmt (option_usage_text.apz_str[ 25])
+#define zForkFail (option_usage_text.apz_str[ 26])
+#define zFSErrOptLoad (option_usage_text.apz_str[ 27])
+#define zFSErrReadFile (option_usage_text.apz_str[ 28])
+#define zFSOptError (option_usage_text.apz_str[ 29])
+#define zFSOptErrMayExist (option_usage_text.apz_str[ 30])
+#define zFSOptErrMustExist (option_usage_text.apz_str[ 31])
+#define zFSOptErrNoExist (option_usage_text.apz_str[ 32])
+#define zFSOptErrOpen (option_usage_text.apz_str[ 33])
+#define zFSOptErrFopen (option_usage_text.apz_str[ 34])
+#define zFileCannotExist (option_usage_text.apz_str[ 35])
+#define zFileMustExist (option_usage_text.apz_str[ 36])
+#define zGenshell (option_usage_text.apz_str[ 37])
#define zGnuBoolArg (option_usage_text.utpz_GnuBoolArg)
-#define zGnuBreak (option_usage_text.apz_str[ 28])
+#define zGnuBreak (option_usage_text.apz_str[ 38])
#define zGnuKeyArg (option_usage_text.utpz_GnuKeyArg)
+#define zGnuFileArg (option_usage_text.utpz_GnuFileArg)
#define zGnuKeyLArg (option_usage_text.utpz_GnuKeyLArg)
-#define zGnuNestArg (option_usage_text.apz_str[ 29])
+#define zGnuTimeArg (option_usage_text.utpz_GnuTimeArg)
+#define zGnuNestArg (option_usage_text.apz_str[ 39])
#define zGnuNumArg (option_usage_text.utpz_GnuNumArg)
-#define zGnuOptArg (option_usage_text.apz_str[ 30])
-#define zGnuOptFmt (option_usage_text.apz_str[ 31])
+#define zGnuOptArg (option_usage_text.apz_str[ 40])
+#define zGnuOptFmt (option_usage_text.apz_str[ 41])
#define zGnuStrArg (option_usage_text.utpz_GnuStrArg)
-#define zIllOptChr (option_usage_text.apz_str[ 32])
-#define zIllOptStr (option_usage_text.apz_str[ 33])
-#define zIllegal (option_usage_text.apz_str[ 34])
-#define zInvalOptDesc (option_usage_text.apz_str[ 35])
-#define zKeyWords (option_usage_text.apz_str[ 36])
-#define zLoadCooked (option_usage_text.apz_str[ 37])
-#define zLoadKeep (option_usage_text.apz_str[ 38])
-#define zLoadType (option_usage_text.apz_str[ 39])
-#define zLoadUncooked (option_usage_text.apz_str[ 40])
-#define zLtypeInteger (option_usage_text.apz_str[ 41])
-#define zLtypeNest (option_usage_text.apz_str[ 42])
-#define zLtypeString (option_usage_text.apz_str[ 43])
-#define zLtypeBool (option_usage_text.apz_str[ 44])
-#define zLtypeKeyword (option_usage_text.apz_str[ 45])
-#define zLtypeSetMembership (option_usage_text.apz_str[ 46])
-#define zMembers (option_usage_text.apz_str[ 47])
-#define zMisArg (option_usage_text.apz_str[ 48])
-#define zMultiEquiv (option_usage_text.apz_str[ 49])
-#define zMust (option_usage_text.apz_str[ 50])
-#define zNeedOne (option_usage_text.apz_str[ 51])
-#define zNoArg (option_usage_text.apz_str[ 52])
-#define zNoArgs (option_usage_text.apz_str[ 53])
-#define zNoCreat (option_usage_text.apz_str[ 54])
-#define zNoFlags (option_usage_text.apz_str[ 55])
-#define zNoKey (option_usage_text.apz_str[ 56])
-#define zNoLim (option_usage_text.apz_str[ 57])
-#define zNoPreset (option_usage_text.apz_str[ 58])
-#define zNoRq_NoShrtTtl (option_usage_text.apz_str[ 59])
-#define zNoRq_ShrtTtl (option_usage_text.apz_str[ 60])
-#define zNoStat (option_usage_text.apz_str[ 61])
-#define zNoState (option_usage_text.apz_str[ 62])
-#define zNone (option_usage_text.apz_str[ 63])
-#define zNotDef (option_usage_text.apz_str[ 64])
-#define zNotEnough (option_usage_text.apz_str[ 65])
-#define zNotFile (option_usage_text.apz_str[ 66])
-#define zNotNumber (option_usage_text.apz_str[ 67])
-#define zNrmOptFmt (option_usage_text.apz_str[ 68])
-#define zNumberOpt (option_usage_text.apz_str[ 69])
-#define zOneSpace (option_usage_text.apz_str[ 70])
-#define zOnlyOne (option_usage_text.apz_str[ 71])
-#define zOptsOnly (option_usage_text.apz_str[ 72])
-#define zPathFmt (option_usage_text.apz_str[ 73])
-#define zPlsSendBugs (option_usage_text.apz_str[ 74])
-#define zPreset (option_usage_text.apz_str[ 75])
-#define zPresetFile (option_usage_text.apz_str[ 76])
-#define zPresetIntro (option_usage_text.apz_str[ 77])
-#define zProg (option_usage_text.apz_str[ 78])
-#define zProhib (option_usage_text.apz_str[ 79])
-#define zReorder (option_usage_text.apz_str[ 80])
-#define zReqFmt (option_usage_text.apz_str[ 81])
-#define zReqOptFmt (option_usage_text.apz_str[ 82])
-#define zReqThese (option_usage_text.apz_str[ 83])
-#define zReq_NoShrtTtl (option_usage_text.apz_str[ 84])
-#define zReq_ShrtTtl (option_usage_text.apz_str[ 85])
-#define zSepChars (option_usage_text.apz_str[ 86])
-#define zSetMembers (option_usage_text.apz_str[ 87])
-#define zSetMemberSettings (option_usage_text.apz_str[ 88])
-#define zShrtGnuOptFmt (option_usage_text.apz_str[ 89])
-#define zSixSpaces (option_usage_text.apz_str[ 90])
-#define zStdBoolArg (option_usage_text.apz_str[ 91])
-#define zStdBreak (option_usage_text.apz_str[ 92])
-#define zStdKeyArg (option_usage_text.apz_str[ 93])
-#define zStdKeyLArg (option_usage_text.apz_str[ 94])
-#define zStdNestArg (option_usage_text.apz_str[ 95])
-#define zStdNoArg (option_usage_text.apz_str[ 96])
-#define zStdNumArg (option_usage_text.apz_str[ 97])
-#define zStdOptArg (option_usage_text.apz_str[ 98])
-#define zStdReqArg (option_usage_text.apz_str[ 99])
-#define zStdStrArg (option_usage_text.apz_str[100])
-#define zTabHyp (option_usage_text.apz_str[101])
-#define zTabHypAnd (option_usage_text.apz_str[102])
-#define zTabout (option_usage_text.apz_str[103])
-#define zThreeSpaces (option_usage_text.apz_str[104])
-#define zTwoSpaces (option_usage_text.apz_str[105])
-#define zUpTo (option_usage_text.apz_str[106])
-#define zValidKeys (option_usage_text.apz_str[107])
+#define zIllOptChr (option_usage_text.apz_str[ 42])
+#define zIllOptStr (option_usage_text.apz_str[ 43])
+#define zIllegal (option_usage_text.apz_str[ 44])
+#define zIntRange (option_usage_text.apz_str[ 45])
+#define zInvalOptDesc (option_usage_text.apz_str[ 46])
+#define zLowerBits (option_usage_text.apz_str[ 47])
+#define zMembers (option_usage_text.apz_str[ 48])
+#define zMisArg (option_usage_text.apz_str[ 49])
+#define zMultiEquiv (option_usage_text.apz_str[ 50])
+#define zMust (option_usage_text.apz_str[ 51])
+#define zNeedOne (option_usage_text.apz_str[ 52])
+#define zNoArg (option_usage_text.apz_str[ 53])
+#define zNoArgs (option_usage_text.apz_str[ 54])
+#define zNoCreat (option_usage_text.apz_str[ 55])
+#define zNoFlags (option_usage_text.apz_str[ 56])
+#define zNoKey (option_usage_text.apz_str[ 57])
+#define zNoLim (option_usage_text.apz_str[ 58])
+#define zNoPreset (option_usage_text.apz_str[ 59])
+#define zNoResetArg (option_usage_text.apz_str[ 60])
+#define zNoRq_NoShrtTtl (option_usage_text.apz_str[ 61])
+#define zNoRq_ShrtTtl (option_usage_text.apz_str[ 62])
+#define zNoStat (option_usage_text.apz_str[ 63])
+#define zNoState (option_usage_text.apz_str[ 64])
+#define zNone (option_usage_text.apz_str[ 65])
+#define zNotDef (option_usage_text.apz_str[ 66])
+#define zNotCmdOpt (option_usage_text.apz_str[ 67])
+#define zNotEnough (option_usage_text.apz_str[ 68])
+#define zNotFile (option_usage_text.apz_str[ 69])
+#define zNotNumber (option_usage_text.apz_str[ 70])
+#define zNrmOptFmt (option_usage_text.apz_str[ 71])
+#define zNumberOpt (option_usage_text.apz_str[ 72])
+#define zOneSpace (option_usage_text.apz_str[ 73])
+#define zOnlyOne (option_usage_text.apz_str[ 74])
+#define zOptsOnly (option_usage_text.apz_str[ 75])
+#define zPathFmt (option_usage_text.apz_str[ 76])
+#define zPlsSendBugs (option_usage_text.apz_str[ 77])
+#define zPreset (option_usage_text.apz_str[ 78])
+#define zPresetFile (option_usage_text.apz_str[ 79])
+#define zPresetIntro (option_usage_text.apz_str[ 80])
+#define zProg (option_usage_text.apz_str[ 81])
+#define zProhib (option_usage_text.apz_str[ 82])
+#define zReorder (option_usage_text.apz_str[ 83])
+#define zRange (option_usage_text.apz_str[ 84])
+#define zRangeAbove (option_usage_text.apz_str[ 85])
+#define zRangeLie (option_usage_text.apz_str[ 86])
+#define zRangeBadLie (option_usage_text.apz_str[ 87])
+#define zRangeOnly (option_usage_text.apz_str[ 88])
+#define zRangeOr (option_usage_text.apz_str[ 89])
+#define zRangeErr (option_usage_text.apz_str[ 90])
+#define zRangeExact (option_usage_text.apz_str[ 91])
+#define zRangeScaled (option_usage_text.apz_str[ 92])
+#define zRangeUpto (option_usage_text.apz_str[ 93])
+#define zResetNotConfig (option_usage_text.apz_str[ 94])
+#define zReqFmt (option_usage_text.apz_str[ 95])
+#define zReqOptFmt (option_usage_text.apz_str[ 96])
+#define zReqThese (option_usage_text.apz_str[ 97])
+#define zReq_NoShrtTtl (option_usage_text.apz_str[ 98])
+#define zReq_ShrtTtl (option_usage_text.apz_str[ 99])
+#define zSepChars (option_usage_text.apz_str[100])
+#define zSetMemberSettings (option_usage_text.apz_str[101])
+#define zShrtGnuOptFmt (option_usage_text.apz_str[102])
+#define zSixSpaces (option_usage_text.apz_str[103])
+#define zStdBoolArg (option_usage_text.apz_str[104])
+#define zStdBreak (option_usage_text.apz_str[105])
+#define zStdFileArg (option_usage_text.apz_str[106])
+#define zStdKeyArg (option_usage_text.apz_str[107])
+#define zStdKeyLArg (option_usage_text.apz_str[108])
+#define zStdTimeArg (option_usage_text.apz_str[109])
+#define zStdNestArg (option_usage_text.apz_str[110])
+#define zStdNoArg (option_usage_text.apz_str[111])
+#define zStdNumArg (option_usage_text.apz_str[112])
+#define zStdOptArg (option_usage_text.apz_str[113])
+#define zStdReqArg (option_usage_text.apz_str[114])
+#define zStdStrArg (option_usage_text.apz_str[115])
+#define zTabHyp (option_usage_text.apz_str[116])
+#define zTabHypAnd (option_usage_text.apz_str[117])
+#define zTabout (option_usage_text.apz_str[118])
+#define zThreeSpaces (option_usage_text.apz_str[119])
+#define zTwoSpaces (option_usage_text.apz_str[120])
+#define zUpTo (option_usage_text.apz_str[121])
+#define zValidKeys (option_usage_text.apz_str[122])
/*
* First, set up the strings. Some of these are writable. These are all in
static char eng_zGnuBoolArg[] = "=T/F";
static char eng_zGnuKeyArg[] = "=KWd";
+ static char eng_zGnuFileArg[] = "=file";
static char eng_zGnuKeyLArg[] = "=Mbr";
+ static char eng_zGnuTimeArg[] = "=Tim";
static char eng_zGnuNumArg[] = "=num";
static char eng_zGnuStrArg[] = "=str";
-static char const usage_txt[3208] =
+static char const usage_txt[4024] =
"AutoOpts function called without option descriptor\n\0"
"\tThis exceeds the compiled library version: \0"
"Automated Options Processing Error!\n"
"\t%s called AutoOpts function with structure version %d:%d:%d.\n\0"
"\tThis is less than the minimum library version: \0"
+ "Automated Options version %s\n"
+ "\tcopyright (c) 1999-2009 by Bruce Korb - all rights reserved\n\0"
+ "AutoOpts lib error: defaulted to option with optional arg\n\0"
"all\0"
"\t\t\t\t- an alternate for %s\n\0"
"%s error: the keyword `%s' is ambiguous for %s\n\0"
- "ambiguous\0"
+ "%s: ambiguous option -- %s\n\0"
"%s: Command line arguments required\n\0"
"%d %s%s options allowed\n\0"
"version and help options:\0"
"fs error %d (%s) on fork - cannot obtain %s usage\n\0"
"File error %d (%s) opening %s for loading options\n\0"
"fs error %d (%s) reading file %s\n\0"
+ "fs error %d (%s) on %s %s for option %s\n\0"
+ "stat-ing for directory\0"
+ "stat-ing for regular file\0"
+ "stat-ing for non-existant file\0"
+ "open-ing file\0"
+ "fopen-ing file\0"
+ "\t\t\t\t- file must not pre-exist\n\0"
+ "\t\t\t\t- file must pre-exist\n\0"
"\n"
"= = = = = = = =\n\n"
"This incarnation of genshell will produce\n"
"[=arg]\0"
"--%2$s%1$s\0"
"%s: illegal option -- %c\n\0"
- "%s: %s option -- %s\n\0"
+ "%s: illegal option -- %s\n\0"
"illegal\0"
+ " or an integer from %d through %d\n\0"
"AutoOpts ERROR: invalid option descriptor for %s\n\0"
- "words=\0"
- "cooked\0"
- "keep\0"
- "type=\0"
- "uncooked\0"
- "integer\0"
- "nested\0"
- "string\0"
- "bool\0"
- "keyword\0"
- "set\0"
+ " or an integer mask with any of the lower %d bits set\n\0"
"\t\t\t\t- is a set membership option\n\0"
"%s: option `%s' requires an argument\n\0"
"Equivalenced option '%s' was equivalenced to both\n"
"%s error: `%s' does not match any %s keywords\n\0"
"\t\t\t\t- may appear multiple times\n\0"
"\t\t\t\t- may not be preset\n\0"
+ "The 'reset-option' option requires an argument\n\0"
" Arg Option-Name Description\n\0"
" Flg Arg Option-Name Description\n\0"
"error %d (%s) stat-ing %s\n\0"
"%s(optionRestore): error: no saved option state\n\0"
"none\0"
"'%s' not defined\n\0"
+ "'%s' is not a command line option\n\0"
"ERROR: The %s option must appear %d times\n\0"
"error: cannot load options from non-regular file %s\n\0"
"%s error: `%s' is not a recognizable number\n\0"
"program\0"
"prohibits these options:\n\0"
"Operands and options may be intermixed. They will be reordered.\n\0"
+ "%s%ld to %ld\0"
+ "%sgreater than or equal to %ld\0"
+ "%sIt must lie in one of the ranges:\n\0"
+ "%sThis option must lie in one of the ranges:\n\0"
+ "%sit must be: \0"
+ ", or\n\0"
+ "%s error: %s option value ``%s'' is out of range.\n\0"
+ "%s%ld exactly\0"
+ "%sis scalable with a suffix: k/K/m/M/g/G/t/T\n\0"
+ "%sless than or equal to %ld\0"
+ "The --reset-option has not been configured.\n\0"
"ERROR: %s option requires the %s option\n\0"
" %3s %-14s %s\0"
"requires these options:\n\0"
" Arg Option-Name Req? Description\n\0"
" Flg Arg Option-Name Req? Description\n\0"
"-_^\0"
- "members=\0"
"or you may use a numeric representation. Preceding these with a '!' will\n"
"clear the bits, specifying 'none' will clear all bits, and 'all' will set them\n"
"all. Multiple entries may be passed as an option argument list.\n\0"
"\n"
"%s\n\n"
"%s\0"
+ "Fil\0"
"KWd\0"
"Mbr\0"
+ "Tim\0"
"Cpx\0"
"no \0"
"Num\0"
* Aren't you glad you don't maintain this by hand?
*/
usage_text_t option_usage_text = {
- 113,
- eng_zGnuBoolArg, eng_zGnuKeyArg, eng_zGnuKeyLArg, eng_zGnuNumArg,
- eng_zGnuStrArg,
+ 130,
+ eng_zGnuBoolArg, eng_zGnuKeyArg, eng_zGnuFileArg, eng_zGnuKeyLArg,
+ eng_zGnuTimeArg, eng_zGnuNumArg, eng_zGnuStrArg,
{
usage_txt + 0, usage_txt + 52, usage_txt + 98, usage_txt + 197,
- usage_txt + 247, usage_txt + 251, usage_txt + 278, usage_txt + 327,
- usage_txt + 337, usage_txt + 374, usage_txt + 399, usage_txt + 425,
- usage_txt + 465, usage_txt + 602, usage_txt + 650, usage_txt + 704,
- usage_txt + 746, usage_txt + 770, usage_txt + 796, usage_txt + 809,
- usage_txt + 823, usage_txt + 870, usage_txt + 876, usage_txt + 979,
- usage_txt + 991, usage_txt +1042, usage_txt +1093, usage_txt +1127,
- usage_txt +1233, usage_txt +1239, usage_txt +1245, usage_txt +1252,
- usage_txt +1263, usage_txt +1289, usage_txt +1310, usage_txt +1318,
- usage_txt +1369, usage_txt +1376, usage_txt +1383, usage_txt +1388,
- usage_txt +1394, usage_txt +1403, usage_txt +1411, usage_txt +1418,
- usage_txt +1425, usage_txt +1430, usage_txt +1438, usage_txt +1442,
- usage_txt +1476, usage_txt +1514, usage_txt +1579, usage_txt +1622,
- usage_txt +1657, usage_txt +1698, usage_txt +1738, usage_txt +1765,
- usage_txt +1832, usage_txt +1880, usage_txt +1913, usage_txt +1938,
- usage_txt +1973, usage_txt +2011, usage_txt +2038, usage_txt +2087,
- usage_txt +2092, usage_txt +2110, usage_txt +2154, usage_txt +2208,
- usage_txt +2254, usage_txt +2262, usage_txt +2310, usage_txt +2312,
- usage_txt +2337, usage_txt +2371, usage_txt +2390, usage_txt +2424,
- usage_txt +2460, usage_txt +2498, usage_txt +2554, usage_txt +2562,
- usage_txt +2588, usage_txt +2654, usage_txt +2696, usage_txt +2710,
- usage_txt +2735, usage_txt +2775, usage_txt +2818, usage_txt +2822,
- usage_txt +2831, usage_txt +3050, usage_txt +3053, usage_txt +3060,
- usage_txt +3064, usage_txt +3072, usage_txt +3076, usage_txt +3080,
- usage_txt +3084, usage_txt +3088, usage_txt +3092, usage_txt +3096,
- usage_txt +3100, usage_txt +3104, usage_txt +3111, usage_txt +3123,
- usage_txt +3131, usage_txt +3135, usage_txt +3138, usage_txt +3171
+ usage_txt + 247, usage_txt + 338, usage_txt + 397, usage_txt + 401,
+ usage_txt + 428, usage_txt + 477, usage_txt + 505, usage_txt + 542,
+ usage_txt + 567, usage_txt + 593, usage_txt + 633, usage_txt + 770,
+ usage_txt + 818, usage_txt + 872, usage_txt + 914, usage_txt + 938,
+ usage_txt + 964, usage_txt + 977, usage_txt + 991, usage_txt +1038,
+ usage_txt +1044, usage_txt +1147, usage_txt +1159, usage_txt +1210,
+ usage_txt +1261, usage_txt +1295, usage_txt +1336, usage_txt +1359,
+ usage_txt +1385, usage_txt +1416, usage_txt +1430, usage_txt +1445,
+ usage_txt +1476, usage_txt +1503, usage_txt +1609, usage_txt +1615,
+ usage_txt +1621, usage_txt +1628, usage_txt +1639, usage_txt +1665,
+ usage_txt +1691, usage_txt +1699, usage_txt +1735, usage_txt +1786,
+ usage_txt +1842, usage_txt +1876, usage_txt +1914, usage_txt +1979,
+ usage_txt +2022, usage_txt +2057, usage_txt +2098, usage_txt +2138,
+ usage_txt +2165, usage_txt +2232, usage_txt +2280, usage_txt +2313,
+ usage_txt +2338, usage_txt +2386, usage_txt +2421, usage_txt +2459,
+ usage_txt +2486, usage_txt +2535, usage_txt +2540, usage_txt +2558,
+ usage_txt +2593, usage_txt +2637, usage_txt +2691, usage_txt +2737,
+ usage_txt +2745, usage_txt +2793, usage_txt +2795, usage_txt +2820,
+ usage_txt +2854, usage_txt +2873, usage_txt +2907, usage_txt +2943,
+ usage_txt +2981, usage_txt +3037, usage_txt +3045, usage_txt +3071,
+ usage_txt +3137, usage_txt +3150, usage_txt +3181, usage_txt +3218,
+ usage_txt +3264, usage_txt +3280, usage_txt +3286, usage_txt +3338,
+ usage_txt +3352, usage_txt +3398, usage_txt +3426, usage_txt +3471,
+ usage_txt +3513, usage_txt +3527, usage_txt +3552, usage_txt +3592,
+ usage_txt +3635, usage_txt +3639, usage_txt +3858, usage_txt +3861,
+ usage_txt +3868, usage_txt +3872, usage_txt +3880, usage_txt +3884,
+ usage_txt +3888, usage_txt +3892, usage_txt +3896, usage_txt +3900,
+ usage_txt +3904, usage_txt +3908, usage_txt +3912, usage_txt +3916,
+ usage_txt +3920, usage_txt +3927, usage_txt +3939, usage_txt +3947,
+ usage_txt +3951, usage_txt +3954, usage_txt +3987
}
};
/*
- * $Id: boolean.c,v 4.10 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2007-01-13 10:10:39 bkorb"
+ * $Id: boolean.c,v 4.16 2009/01/01 16:51:47 bkorb Exp $
+ * Time-stamp: "2008-08-03 13:06:02 bkorb"
*
* Automated Options Paged Usage module.
*
* This routine will run run-on options through a pager so the
* user may examine, print or edit them at their leisure.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
*
- * Automated Options 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.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * These files have the following md5sums:
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
/*=export_func optionBooleanVal
char* pz;
ag_bool res = AG_TRUE;
+ if ((pOD->fOptState & OPTST_RESET) != 0)
+ return;
+
+ if (pOD->optArg.argString == NULL) {
+ pOD->optArg.argBool = AG_FALSE;
+ return;
+ }
+
switch (*(pOD->optArg.argString)) {
case '0':
{
/* -*- Mode: C -*- */
-/* --- fake the preprocessor into handlng portability */
-/*
- * Time-stamp: "2007-02-03 17:41:06 bkorb"
+/* compat.h --- fake the preprocessor into handlng portability
+ *
+ * Time-stamp: "2008-06-14 09:36:25 bkorb"
+ *
+ * $Id: compat.h,v 4.21 2009/01/01 16:51:52 bkorb Exp $
+ *
+ * compat.h is free software.
+ * This file is part of AutoGen.
+ *
+ * AutoGen copyright (c) 1992-2009 by Bruce Korb - all rights reserved
+ *
+ * AutoGen 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.
+ *
+ * AutoGen 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.
*
- * Author: Gary V Vaughan <gvaughan@oranda.demon.co.uk>
- * Created: Mon Jun 30 15:54:46 1997
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
*
- * $Id: compat.h,v 4.16 2007/04/27 01:10:47 bkorb Exp $
+ * As a special exception, Bruce Korb gives permission for additional
+ * uses of the text contained in the release of compat.h.
+ *
+ * The exception is that, if you link the compat.h library with other
+ * files to produce an executable, this does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * Your use of that executable is in no way restricted on account of
+ * linking the compat.h library code into it.
+ *
+ * This exception does not however invalidate any other reasons why
+ * the executable file might be covered by the GNU General Public License.
+ *
+ * This exception applies only to the code released by Bruce Korb under
+ * the name compat.h. If you copy code from other sources under the
+ * General Public License into a copy of compat.h, as the General Public
+ * License permits, the exception does not apply to the code that you add
+ * in this way. To avoid misleading anyone as to the status of such
+ * modified files, you must delete this exception notice from them.
+ *
+ * If you write modifications of your own for compat.h, it is your choice
+ * whether to permit this exception to apply to your modifications.
+ * If you do not wish that, delete this exception notice.
*/
#ifndef COMPAT_H_GUARD
#define COMPAT_H_GUARD 1
#ifndef HAVE_UINTPTR_T
typedef unsigned long uintptr_t;
#endif
+#ifndef HAVE_SIZE_T
+ typedef unsigned int size_t;
+#endif
+#ifndef HAVE_WINT_T
+ typedef unsigned int wint_t;
+#endif
+#ifndef HAVE_PID_T
+ typedef signed int pid_t;
+#endif
/* redefine these for BSD style string libraries */
#ifndef HAVE_STRCHR
/*
* Author: Gary V Vaughan <gvaughan@oranda.demon.co.uk>
* Time-stamp: "2006-09-23 19:46:16 bkorb"
- * Created: Tue Jun 24 15:07:31 1997
- * Last Modified: $Date: 2006/11/27 01:52:23 $
+ * Last Modified: $Date: 2007/07/04 20:51:18 $
* by: bkorb
*
- * $Id: pathfind.c,v 4.10 2006/11/27 01:52:23 bkorb Exp $
+ * $Id: pathfind.c,v 4.11 2007/07/04 20:51:18 bkorb Exp $
*/
/* Code: */
/*
- * Time-stamp: "2006-10-14 14:55:09 bkorb"
+ * Time-stamp: "2007-07-04 09:45:44 bkorb"
* by: bkorb
- * Last Committed: $Date: 2007/04/28 22:19:23 $
+ * Last Committed: $Date: 2007/07/04 20:51:18 $
+ *
+ * This file is part of AutoGen.
+ *
+ * AutoGen copyright (c) 1992-2007 Bruce Korb - all rights reserved
+ *
+ * AutoGen 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.
+ *
+ * AutoGen 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 <http://www.gnu.org/licenses/>.
*/
#ifndef WINDOWS_CONFIG_HACKERY
#define WINDOWS_CONFIG_HACKERY 1
/*
- * $Id: configfile.c,v 1.21 2007/04/15 19:01:18 bkorb Exp $
- * Time-stamp: "2007-04-15 11:22:46 bkorb"
+ * $Id: configfile.c,v 1.35 2009/01/18 22:48:51 bkorb Exp $
+ * Time-stamp: "2009-01-18 10:21:58 bkorb"
*
* configuration/rc/ini file handling.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
*
- * Automated Options 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.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * These files have the following md5sums:
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static void
filePreset(
tOptions* pOpts,
char* pzText,
tOptionValue* pType );
-static char*
-parseLoadMode(
- char* pzText,
- tOptionLoadMode* pMode );
-
static char*
parseSetMemType(
tOptions* pOpts,
int direction )
{
tmap_info_t cfgfile;
- tOptState st = OPTSTATE_INITIALIZER(PRESET);
+ tOptState optst = OPTSTATE_INITIALIZER(PRESET);
char* pzFileText =
text_mmap( pzFileName, PROT_READ|PROT_WRITE, MAP_PRIVATE, &cfgfile );
return;
if (direction == DIRECTION_CALLED) {
- st.flags = OPTST_DEFINED;
- direction = DIRECTION_PROCESS;
+ optst.flags = OPTST_DEFINED;
+ direction = DIRECTION_PROCESS;
}
/*
* and we consider stuff set herein to be "set" by the client program.
*/
if ((pOpts->fOptSet & OPTPROC_PRESETTING) == 0)
- st.flags = OPTST_SET;
+ optst.flags = OPTST_SET;
do {
- while (isspace( (int)*pzFileText )) pzFileText++;
+ while (IS_WHITESPACE_CHAR(*pzFileText)) pzFileText++;
- if (isalpha( (int)*pzFileText )) {
- pzFileText = handleConfig( pOpts, &st, pzFileText, direction );
+ if (IS_VAR_FIRST_CHAR(*pzFileText)) {
+ pzFileText = handleConfig(pOpts, &optst, pzFileText, direction);
} else switch (*pzFileText) {
case '<':
- if (isalpha( (int)pzFileText[1] ))
- pzFileText = handleStructure(pOpts, &st, pzFileText, direction);
+ if (IS_VAR_FIRST_CHAR(pzFileText[1]))
+ pzFileText =
+ handleStructure(pOpts, &optst, pzFileText, direction);
else switch (pzFileText[1]) {
case '?':
if (pzEnd == NULL)
return pzText + strlen(pzText);
- while (ISNAMECHAR( (int)*pzText )) pzText++;
- while (isspace( (int)*pzText )) pzText++;
+ while (IS_VALUE_NAME_CHAR(*pzText)) pzText++;
+ while (IS_WHITESPACE_CHAR(*pzText)) pzText++;
if (pzText > pzEnd) {
name_only:
*pzEnd++ = NUL;
* is an invalid format and we give up parsing the text.
*/
if ((*pzText == '=') || (*pzText == ':')) {
- while (isspace( (int)*++pzText )) ;
+ while (IS_WHITESPACE_CHAR(*++pzText)) ;
if (pzText > pzEnd)
goto name_only;
- } else if (! isspace((int)pzText[-1]))
+ } else if (! IS_WHITESPACE_CHAR(pzText[-1]))
return NULL;
/*
size_t name_len;
if ( (strncmp( pzText+2, zProg, title_len ) != 0)
- || (! isspace( (int)pzText[title_len+2] )) ) {
+ || (! IS_WHITESPACE_CHAR(pzText[title_len+2])) ) {
pzText = strchr( pzText+2, '>' );
if (pzText != NULL)
pzText++;
do {
pzText += title_len;
- if (isspace((int)*pzText)) {
- while (isspace((int)*pzText)) pzText++;
+ if (IS_WHITESPACE_CHAR(*pzText)) {
+ while (IS_WHITESPACE_CHAR(*++pzText)) ;
if ( (strneqvcmp( pzText, pOpts->pzProgName, (int)name_len) == 0)
&& (pzText[name_len] == '>')) {
pzText += name_len + 1;
int direction )
{
tOptionLoadMode mode = option_load_mode;
- tOptionValue valu;
+ tOptionValue valu;
char* pzName = ++pzText;
char* pzData;
char* pcNulPoint;
- while (ISNAMECHAR( *pzText )) pzText++;
+ while (IS_VALUE_NAME_CHAR(*pzText)) pzText++;
pcNulPoint = pzText;
valu.valType = OPARG_TYPE_STRING;
*/
memset(pcNulPoint, ' ', pzData - pcNulPoint);
+ /*
+ * If we are getting a "string" value, the process the XML-ish
+ * %XX hex characters.
+ */
+ if (valu.valType == OPARG_TYPE_STRING) {
+ char * pzSrc = pzData;
+ char * pzDst = pzData;
+ char bf[4];
+ bf[2] = NUL;
+
+ for (;;) {
+ int ch = ((int)*(pzSrc++)) & 0xFF;
+ switch (ch) {
+ case NUL: goto string_fixup_done;
+
+ case '%':
+ bf[0] = *(pzSrc++);
+ bf[1] = *(pzSrc++);
+ if ((bf[0] == NUL) || (bf[1] == NUL))
+ goto string_fixup_done;
+ ch = strtoul(bf, NULL, 16);
+ /* FALLTHROUGH */
+
+ default:
+ *(pzDst++) = ch;
+ }
+ } string_fixup_done:;
+ *pzDst = NUL;
+ }
+
/*
* "pzName" points to what looks like text for one option/configurable.
* It is NUL terminated. Process it.
LOCAL void
internalFileLoad( tOptions* pOpts )
{
- int idx;
- int inc = DIRECTION_PRESET;
- char zFileName[ AG_PATH_MAX+1 ];
+ uint32_t svfl;
+ int idx;
+ int inc;
+ char zFileName[ AG_PATH_MAX+1 ];
if (pOpts->papzHomeList == NULL)
return;
+ svfl = pOpts->fOptSet;
+ inc = DIRECTION_PRESET;
+
+ /*
+ * Never stop on errors in config files.
+ */
+ pOpts->fOptSet &= ~OPTPROC_ERRSTOP;
+
/*
* Find the last RC entry (highest priority entry)
*/
}
}
} /* twice for every path in the home list, ... */
+
+ pOpts->fOptSet = svfl;
}
void
optionLoadOpt( tOptions* pOpts, tOptDesc* pOptDesc )
{
+ struct stat sb;
+
/*
* IF the option is not being disabled, THEN load the file. There must
* be a file. (If it is being disabled, then the disablement processing
* already took place. It must be done to suppress preloading of ini/rc
* files.)
*/
- if (! DISABLED_OPT( pOptDesc )) {
- struct stat sb;
- if (stat( pOptDesc->optArg.argString, &sb ) != 0) {
- if ((pOpts->fOptSet & OPTPROC_ERRSTOP) == 0)
- return;
-
- fprintf( stderr, zFSErrOptLoad, errno, strerror( errno ),
- pOptDesc->optArg.argString );
- exit(EX_NOINPUT);
- /* NOT REACHED */
- }
+ if ( DISABLED_OPT(pOptDesc)
+ || ((pOptDesc->fOptState & OPTST_RESET) != 0))
+ return;
- if (! S_ISREG( sb.st_mode )) {
- if ((pOpts->fOptSet & OPTPROC_ERRSTOP) == 0)
- return;
+ if (stat( pOptDesc->optArg.argString, &sb ) != 0) {
+ if ((pOpts->fOptSet & OPTPROC_ERRSTOP) == 0)
+ return;
- fprintf( stderr, zNotFile, pOptDesc->optArg.argString );
- exit(EX_NOINPUT);
- /* NOT REACHED */
- }
+ fprintf( stderr, zFSErrOptLoad, errno, strerror( errno ),
+ pOptDesc->optArg.argString );
+ exit(EX_NOINPUT);
+ /* NOT REACHED */
+ }
- filePreset(pOpts, pOptDesc->optArg.argString, DIRECTION_CALLED);
+ if (! S_ISREG( sb.st_mode )) {
+ if ((pOpts->fOptSet & OPTPROC_ERRSTOP) == 0)
+ return;
+
+ fprintf( stderr, zNotFile, pOptDesc->optArg.argString );
+ exit(EX_NOINPUT);
+ /* NOT REACHED */
}
+
+ filePreset(pOpts, pOptDesc->optArg.argString, DIRECTION_CALLED);
}
tOptionLoadMode* pMode,
tOptionValue* pType )
{
- size_t lenLoadType = strlen( zLoadType );
- size_t lenKeyWords = strlen( zKeyWords );
- size_t lenSetMem = strlen( zSetMembers );
+ size_t len;
do {
- switch (*pzText) {
- case '/': pType->valType = OPARG_TYPE_NONE;
- case '>': return pzText;
+ if (! IS_WHITESPACE_CHAR(*pzText))
+ switch (*pzText) {
+ case '/': pType->valType = OPARG_TYPE_NONE;
+ case '>': return pzText;
- default:
- case NUL: return NULL;
-
- case ' ':
- case '\t':
- case '\n':
- case '\f':
- case '\r':
- case '\v':
+ default:
+ case NUL: return NULL;
+ }
+
+ while (IS_WHITESPACE_CHAR(*++pzText)) ;
+ len = 0;
+ while (IS_LOWER_CASE_CHAR(pzText[len])) len++;
+
+ switch (find_xat_attribute_id(pzText, len)) {
+ case XAT_KWD_TYPE:
+ pzText = parseValueType( pzText+len, pType );
break;
- }
- while (isspace( (int)*++pzText )) ;
+ case XAT_KWD_WORDS:
+ pzText = parseKeyWordType( pOpts, pzText+len, pType );
+ break;
- if (strncmp( pzText, zLoadType, lenLoadType ) == 0) {
- pzText = parseValueType( pzText+lenLoadType, pType );
- continue;
- }
+ case XAT_KWD_MEMBERS:
+ pzText = parseSetMemType( pOpts, pzText+len, pType );
+ break;
- if (strncmp( pzText, zKeyWords, lenKeyWords ) == 0) {
- pzText = parseKeyWordType( pOpts, pzText+lenKeyWords, pType );
- continue;
- }
+ case XAT_KWD_COOKED:
+ pzText += len;
+ if (! IS_END_XML_TOKEN_CHAR(*pzText))
+ goto invalid_kwd;
- if (strncmp( pzText, zSetMembers, lenSetMem ) == 0) {
- pzText = parseSetMemType( pOpts, pzText+lenSetMem, pType );
- continue;
- }
+ *pMode = OPTION_LOAD_COOKED;
+ break;
+
+ case XAT_KWD_UNCOOKED:
+ pzText += len;
+ if (! IS_END_XML_TOKEN_CHAR(*pzText))
+ goto invalid_kwd;
+
+ *pMode = OPTION_LOAD_UNCOOKED;
+ break;
+
+ case XAT_KWD_KEEP:
+ pzText += len;
+ if (! IS_END_XML_TOKEN_CHAR(*pzText))
+ goto invalid_kwd;
+
+ *pMode = OPTION_LOAD_KEEP;
+ break;
- pzText = parseLoadMode( pzText, pMode );
+ default:
+ case XAT_KWD_INVALID:
+ invalid_kwd:
+ pType->valType = OPARG_TYPE_NONE;
+ return skipUnknown( pzText );
+ }
} while (pzText != NULL);
return pzText;
}
-/* parseLoadMode
- *
- * "pzText" points to some name character. We check for "cooked" or
- * "uncooked" or "keep". This function should handle any attribute
- * that does not have an associated value.
- */
-static char*
-parseLoadMode(
- char* pzText,
- tOptionLoadMode* pMode )
-{
- {
- size_t len = strlen(zLoadCooked);
- if (strncmp( pzText, zLoadCooked, len ) == 0) {
- if ( (pzText[len] == '>')
- || (pzText[len] == '/')
- || isspace((int)pzText[len])) {
- *pMode = OPTION_LOAD_COOKED;
- return pzText + len;
- }
- goto unknown;
- }
- }
-
- {
- size_t len = strlen(zLoadUncooked);
- if (strncmp( pzText, zLoadUncooked, len ) == 0) {
- if ( (pzText[len] == '>')
- || (pzText[len] == '/')
- || isspace((int)pzText[len])) {
- *pMode = OPTION_LOAD_UNCOOKED;
- return pzText + len;
- }
- goto unknown;
- }
- }
-
- {
- size_t len = strlen(zLoadKeep);
- if (strncmp( pzText, zLoadKeep, len ) == 0) {
- if ( (pzText[len] == '>')
- || (pzText[len] == '/')
- || isspace((int)pzText[len])) {
- *pMode = OPTION_LOAD_KEEP;
- return pzText + len;
- }
- goto unknown;
- }
- }
-
- unknown:
- return skipUnknown( pzText );
-}
-
-
/* parseSetMemType
*
* "pzText" points to the character after "members="
char* pzText,
tOptionValue* pType )
{
- {
- size_t len = strlen(zLtypeString);
- if (strncmp( pzText, zLtypeString, len ) == 0) {
- if ((pzText[len] == '>') || isspace((int)pzText[len])) {
- pType->valType = OPARG_TYPE_STRING;
- return pzText + len;
- }
- goto unknown;
- }
- }
+ size_t len = 0;
- {
- size_t len = strlen(zLtypeInteger);
- if (strncmp( pzText, zLtypeInteger, len ) == 0) {
- if ((pzText[len] == '>') || isspace((int)pzText[len])) {
- pType->valType = OPARG_TYPE_NUMERIC;
- return pzText + len;
- }
- goto unknown;
- }
- }
+ if (*(pzText++) != '=')
+ goto woops;
- {
- size_t len = strlen(zLtypeBool);
- if (strncmp( pzText, zLtypeBool, len ) == 0) {
- if ((pzText[len] == '>') || isspace(pzText[len])) {
- pType->valType = OPARG_TYPE_BOOLEAN;
- return pzText + len;
- }
- goto unknown;
- }
- }
+ while (IS_OPTION_NAME_CHAR(pzText[len])) len++;
+ pzText += len;
- {
- size_t len = strlen(zLtypeKeyword);
- if (strncmp( pzText, zLtypeKeyword, len ) == 0) {
- if ((pzText[len] == '>') || isspace((int)pzText[len])) {
- pType->valType = OPARG_TYPE_ENUMERATION;
- return pzText + len;
- }
- goto unknown;
- }
+ if ((len == 0) || (! IS_END_XML_TOKEN_CHAR(*pzText))) {
+ woops:
+ pType->valType = OPARG_TYPE_NONE;
+ return skipUnknown( pzText );
}
- {
- size_t len = strlen(zLtypeSetMembership);
- if (strncmp( pzText, zLtypeSetMembership, len ) == 0) {
- if ((pzText[len] == '>') || isspace((int)pzText[len])) {
- pType->valType = OPARG_TYPE_MEMBERSHIP;
- return pzText + len;
- }
- goto unknown;
- }
- }
+ switch (find_value_type_id(pzText - len, len)) {
+ default:
+ case VTP_KWD_INVALID: goto woops;
- {
- size_t len = strlen(zLtypeNest);
- if (strncmp( pzText, zLtypeNest, len ) == 0) {
- if ((pzText[len] == '>') || isspace((int)pzText[len])) {
- pType->valType = OPARG_TYPE_HIERARCHY;
- return pzText + len;
- }
- goto unknown;
- }
+ case VTP_KWD_STRING:
+ pType->valType = OPARG_TYPE_STRING;
+ break;
+
+ case VTP_KWD_INTEGER:
+ pType->valType = OPARG_TYPE_NUMERIC;
+ break;
+
+ case VTP_KWD_BOOL:
+ case VTP_KWD_BOOLEAN:
+ pType->valType = OPARG_TYPE_BOOLEAN;
+ break;
+
+ case VTP_KWD_KEYWORD:
+ pType->valType = OPARG_TYPE_ENUMERATION;
+ break;
+
+ case VTP_KWD_SET:
+ case VTP_KWD_SET_MEMBERSHIP:
+ pType->valType = OPARG_TYPE_MEMBERSHIP;
+ break;
+
+ case VTP_KWD_NESTED:
+ case VTP_KWD_HIERARCHY:
+ pType->valType = OPARG_TYPE_HIERARCHY;
}
- unknown:
- pType->valType = OPARG_TYPE_NONE;
- return skipUnknown( pzText );
+ return pzText;
}
skipUnknown( char* pzText )
{
for (;; pzText++) {
- if (isspace( (int)*pzText )) return pzText;
- switch (*pzText) {
- case NUL: return NULL;
- case '/':
- case '>': return pzText;
- }
+ if (IS_END_XML_TOKEN_CHAR(*pzText)) return pzText;
+ if (*pzText == NUL) return NULL;
}
}
* is available, then go do it.
*/
if ( ((pOpts->fOptSet & OPTPROC_TRANSLATE) != 0)
- && (pOpts->pTransProc != 0) ) {
+ && (pOpts->pTransProc != NULL) ) {
+ /*
+ * If option names are not to be translated at all, then do not do
+ * it for configuration parsing either. (That is the bit that really
+ * gets tested anyway.)
+ */
+ if ((pOpts->fOptSet & OPTPROC_NO_XLAT_MASK) == OPTPROC_NXLAT_OPT)
+ pOpts->fOptSet |= OPTPROC_NXLAT_OPT_CFG;
(*pOpts->pTransProc)();
pOpts->fOptSet &= ~OPTPROC_TRANSLATE;
}
|| (pOpts->structVersion < OPTIONS_MINIMUM_VERSION )
) ) {
- fprintf( stderr, zAO_Err, pOpts->origArgVect[0],
- NUM_TO_VER( pOpts->structVersion ));
+ fprintf(stderr, zAO_Err, pzProgram, NUM_TO_VER(pOpts->structVersion));
if (pOpts->structVersion > OPTIONS_STRUCT_VERSION )
fputs( zAO_Big, stderr );
else
-
/*
- * $Id: cook.c,v 4.10 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2006-09-24 15:21:02 bkorb"
+ * $Id: cook.c,v 4.17 2009/01/01 16:51:47 bkorb Exp $
+ * Time-stamp: "2007-11-16 22:49:11 bkorb"
*
* This file contains the routines that deal with processing quoted strings
* into an internal format.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
*
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * Automated Options 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.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * These files have the following md5sums:
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
- *
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
/* = = = END-STATIC-FORWARD = = = */
/*=export_func ao_string_cook_escape_char
case 't': *pRes = '\t'; break;
case 'v': *pRes = '\v'; break;
- case 'x': /* HEX Escape */
- if (isxdigit( (int)*pzIn )) {
- unsigned int val;
- unsigned char ch = *pzIn++;
-
- if ((ch >= 'A') && (ch <= 'F'))
- val = 10 + (ch - 'A');
- else if ((ch >= 'a') && (ch <= 'f'))
- val = 10 + (ch - 'a');
- else val = ch - '0';
-
- ch = *pzIn;
+ case 'x':
+ case 'X': /* HEX Escape */
+ if (IS_HEX_DIGIT_CHAR(*pzIn)) {
+ char z[4], *pz = z;
- if (! isxdigit( ch )) {
- *pRes = val;
- res = 2;
- break;
- }
- val <<= 4;
- if ((ch >= 'A') && (ch <= 'F'))
- val += 10 + (ch - 'A');
- else if ((ch >= 'a') && (ch <= 'f'))
- val += 10 + (ch - 'a');
- else val += ch - '0';
-
- res = 3;
- *pRes = val;
+ do *(pz++) = *(pzIn++);
+ while (IS_HEX_DIGIT_CHAR(*pzIn) && (pz < z + 2));
+ *pz = NUL;
+ *pRes = (unsigned char)strtoul(z, NULL, 16);
+ res += pz - z;
}
break;
- default:
+ case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7':
+ {
/*
* IF the character copied was an octal digit,
* THEN set the output character to an octal value
*/
- if (isdigit( (int)*pRes ) && (*pRes < '8')) {
- unsigned int val = *pRes - '0';
- unsigned char ch = *pzIn++;
-
- /*
- * IF the second character is *not* an octal digit,
- * THEN save the value and bail
- */
- if ((ch < '0') || (ch > '7')) {
- *pRes = val;
- break;
- }
-
- val = (val<<3) + (ch - '0');
- ch = *pzIn;
- res = 2;
-
- /*
- * IF the THIRD character is *not* an octal digit,
- * THEN save the value and bail
- */
- if ((ch < '0') || (ch > '7')) {
- *pRes = val;
- break;
- }
-
- /*
- * IF the new value would not be too large,
- * THEN add on the third and last character value
- */
- if ((val<<3) < 0xFF) {
- val = (val<<3) + (ch - '0');
- res = 3;
- }
+ char z[4], *pz = z + 1;
+ unsigned long val;
+ z[0] = *pRes;
+
+ while (IS_OCT_DIGIT_CHAR(*pzIn) && (pz < z + 3))
+ *(pz++) = *(pzIn++);
+ *pz = NUL;
+ val = strtoul(z, NULL, 8);
+ if (val > 0xFF)
+ val = 0xFF;
+ *pRes = (unsigned char)val;
+ res = pz - z;
+ break;
+ }
- *pRes = val;
- break;
- }
+ default: ;
}
return res;
pzS++;
scan_for_quote:
- while (isspace((int)*pzS))
+ while (IS_WHITESPACE_CHAR(*pzS))
if (*(pzS++) == '\n')
(*pLineCt)++;
/*
- * $Id: enumeration.c,v 4.17 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2007-01-13 10:22:35 bkorb"
+ * $Id: enumeration.c,v 4.25 2009/01/01 16:51:47 bkorb Exp $
+ * Time-stamp: "2008-07-27 12:28:01 bkorb"
*
* Automated Options Paged Usage module.
*
* This routine will run run-on options through a pager so the
* user may examine, print or edit them at their leisure.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
+ * These files have the following md5sums:
*
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
tSCC* pz_enum_err_fmt;
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static void
enumError(
tOptions* pOpts,
{
size_t max_len = 0;
size_t ttl_len = 0;
+ int ct_down = name_ct;
+ int hidden = 0;
- if (pOpts != NULL)
- fprintf( option_usage_fp, pz_enum_err_fmt, pOpts->pzProgName,
- pOD->optArg.argString, pOD->pz_Name );
+ /*
+ * A real "pOpts" pointer means someone messed up. Give a real error.
+ */
+ if (pOpts > OPTPROC_EMIT_LIMIT)
+ fprintf(option_usage_fp, pz_enum_err_fmt, pOpts->pzProgName,
+ pOD->optArg.argString, pOD->pz_Name);
- fprintf( option_usage_fp, zValidKeys, pOD->pz_Name );
+ fprintf(option_usage_fp, zValidKeys, pOD->pz_Name);
+ /*
+ * If the first name starts with this funny character, then we have
+ * a first value with an unspellable name. You cannot specify it.
+ * So, we don't list it either.
+ */
if (**paz_names == 0x7F) {
paz_names++;
- name_ct--;
+ hidden = 1;
+ ct_down = --name_ct;
}
/*
*/
{
tCC * const * paz = paz_names;
- int ct = name_ct;
do {
size_t len = strlen( *(paz++) ) + 1;
if (len > max_len)
max_len = len;
ttl_len += len;
- } while (--ct > 0);
+ } while (--ct_down > 0);
+
+ ct_down = name_ct;
}
/*
if (max_len > 35) {
do {
fprintf( option_usage_fp, " %s\n", *(paz_names++) );
- } while (--name_ct > 0);
+ } while (--ct_down > 0);
}
/*
do {
fputc( ' ', option_usage_fp );
fputs( *(paz_names++), option_usage_fp );
- } while (--name_ct > 0);
+ } while (--ct_down > 0);
fputc( '\n', option_usage_fp );
}
/*
* Loop through all but the last entry
*/
- while (--name_ct > 0) {
+ ct_down = name_ct;
+ while (--ct_down > 0) {
if (++ent_no == max_len) {
/*
* Last entry on a line. Start next line, too.
}
else
- fprintf( option_usage_fp, zFmt, *(paz_names++) );
+ fprintf(option_usage_fp, zFmt, *(paz_names++) );
}
- fprintf( option_usage_fp, "%s\n", *paz_names );
+ fprintf(option_usage_fp, "%s\n", *paz_names);
}
- /*
- * IF we do not have a pOpts pointer, then this output is being requested
- * by the usage procedure. Let's not re-invoke it recursively.
- */
- if (pOpts != NULL)
+ if (pOpts > OPTPROC_EMIT_LIMIT) {
+ fprintf(option_usage_fp, zIntRange, hidden, name_ct - 1 + hidden);
+
(*(pOpts->pUsageProc))( pOpts, EXIT_FAILURE );
- if (OPTST_GET_ARGTYPE(pOD->fOptState) == OPARG_TYPE_MEMBERSHIP)
- fputs( zSetMemberSettings, option_usage_fp );
+ /* NOTREACHED */
+ }
+
+
+ if (OPTST_GET_ARGTYPE(pOD->fOptState) == OPARG_TYPE_MEMBERSHIP) {
+ fprintf(option_usage_fp, zLowerBits, name_ct);
+ fputs(zSetMemberSettings, option_usage_fp);
+ } else {
+ fprintf(option_usage_fp, zIntRange, hidden, name_ct - 1 + hidden);
+ }
}
tCC* const * paz_names,
unsigned int name_ct )
{
+ /*
+ * Return the matching index as a pointer sized integer.
+ * The result gets stashed in a char* pointer.
+ */
uintptr_t res = name_ct;
size_t len = strlen( (char*)pzName );
uintptr_t idx;
+
+ if (IS_DEC_DIGIT_CHAR(*pzName)) {
+ char * pz = (char *)(void *)pzName;
+ unsigned long val = strtoul(pz, &pz, 0);
+ if ((*pz == NUL) && (val < name_ct))
+ return (uintptr_t)val;
+ enumError(pOpts, pOD, paz_names, (int)name_ct);
+ return name_ct;
+ }
+
/*
* Look for an exact match, but remember any partial matches.
* Multiple partial matches means we have an ambiguous match.
if (paz_names[idx][len] == NUL)
return idx; /* full match */
- if (res != name_ct) {
- pz_enum_err_fmt = zAmbigKey;
- option_usage_fp = stderr;
- enumError( pOpts, pOD, paz_names, (int)name_ct );
- }
- res = idx; /* save partial match */
+ res = (res != name_ct) ? ~0 : idx; /* save partial match */
}
}
- /*
- * no partial match -> error
- */
- if (res == name_ct) {
- pz_enum_err_fmt = zNoKey;
- option_usage_fp = stderr;
- enumError( pOpts, pOD, paz_names, (int)name_ct );
- }
+ if (res < name_ct)
+ return res; /* partial match */
- /*
- * Return the matching index as a char* pointer.
- * The result gets stashed in a char* pointer, so it will have to fit.
- */
- return res;
+ pz_enum_err_fmt = (res == name_ct) ? zNoKey : zAmbigKey;
+ option_usage_fp = stderr;
+ enumError(pOpts, pOD, paz_names, (int)name_ct);
+ return name_ct;
}
tOptDesc od;
od.optArg.argEnum = enum_val;
- (*(pOD->pOptProc))( (void*)(2UL), &od );
+ (*(pOD->pOptProc))(OPTPROC_RETURN_VALNAME, &od );
return od.optArg.argString;
}
* then it is some sort of special request.
*/
switch ((uintptr_t)pOpts) {
- case 0UL:
+ case (uintptr_t)OPTPROC_EMIT_USAGE:
/*
* print the list of enumeration names.
*/
- enumError( pOpts, pOD, paz_names, (int)name_ct );
+ enumError(pOpts, pOD, paz_names, (int)name_ct);
break;
- case 1UL:
+ case (uintptr_t)OPTPROC_EMIT_SHELL:
{
unsigned int ix = pOD->optArg.argEnum;
/*
break;
}
- case 2UL:
+ case (uintptr_t)OPTPROC_RETURN_VALNAME:
{
tSCC zInval[] = "*INVALID*";
unsigned int ix = pOD->optArg.argEnum;
if (ix >= name_ct)
return (uintptr_t)zInval;
- res = (uintptr_t)paz_names[ ix ];
+ pOD->optArg.argString = paz_names[ix];
break;
}
default:
- res = findName( pOD->optArg.argString, pOpts, pOD, paz_names, name_ct );
+ res = findName(pOD->optArg.argString, pOpts, pOD, paz_names, name_ct);
if (pOD->fOptState & OPTST_ALLOC_ARG) {
AGFREE(pOD->optArg.argString);
* then it is some sort of special request.
*/
switch ((uintptr_t)pOpts) {
- case 0UL:
+ case (uintptr_t)OPTPROC_EMIT_USAGE:
/*
* print the list of enumeration names.
*/
- enumError( pOpts, pOD, paz_names, (int)name_ct );
+ enumError(OPTPROC_EMIT_USAGE, pOD, paz_names, (int)name_ct );
return;
- case 1UL:
+ case (uintptr_t)OPTPROC_EMIT_SHELL:
{
/*
* print the name string.
*/
+ int ix = 0;
uintptr_t bits = (uintptr_t)pOD->optCookie;
- uintptr_t res = 0;
size_t len = 0;
+ bits &= ((uintptr_t)1 << (uintptr_t)name_ct) - (uintptr_t)1;
+
while (bits != 0) {
if (bits & 1) {
if (len++ > 0) fputs( " | ", stdout );
- fputs( paz_names[ res ], stdout );
+ fputs(paz_names[ix], stdout);
}
- if (++res >= name_ct) break;
+ if (++ix >= name_ct) break;
bits >>= 1;
}
return;
}
- case 2UL:
+ case (uintptr_t)OPTPROC_RETURN_VALNAME:
{
char* pz;
uintptr_t bits = (uintptr_t)pOD->optCookie;
- uintptr_t res = 0;
- size_t len = 0;
+ int ix = 0;
+ size_t len = 5;
+
+ bits &= ((uintptr_t)1 << (uintptr_t)name_ct) - (uintptr_t)1;
/*
* Replace the enumeration value with the name string.
*/
while (bits != 0) {
if (bits & 1)
- len += strlen( paz_names[ res ]) + 8;
- if (++res >= name_ct) break;
+ len += strlen( paz_names[ix]) + 8;
+ if (++ix >= name_ct) break;
bits >>= 1;
}
- pOD->optArg.argString = pz = AGALOC( len, "enum name" );
+ pOD->optArg.argString = pz = AGALOC(len, "enum name");
/*
* Start by clearing all the bits. We want to turn off any defaults
strcpy( pz, "none" );
pz += 4;
bits = (uintptr_t)pOD->optCookie;
- res = 0;
+ bits &= ((uintptr_t)1 << (uintptr_t)name_ct) - (uintptr_t)1;
+ ix = 0;
+
while (bits != 0) {
if (bits & 1) {
strcpy( pz, " + " );
- strcpy( pz+3, paz_names[ res ]);
- pz += strlen( paz_names[ res ]) + 3;
+ strcpy( pz+3, paz_names[ix]);
+ pz += strlen( paz_names[ix]) + 3;
}
- if (++res >= name_ct) break;
+ if (++ix >= name_ct) break;
bits >>= 1;
}
return;
break;
}
+ if ((pOD->fOptState & OPTST_RESET) != 0)
+ return;
+
{
tCC* pzArg = pOD->optArg.argString;
uintptr_t res;
if (pz != pzArg + len) {
char z[ AO_NAME_SIZE ];
tCC* p;
+ int shift_ct;
+
if (*pz != NUL) {
if (len >= AO_NAME_LIMIT)
break;
p = pzArg;
}
- bit = 1UL << findName(p, pOpts, pOD, paz_names, name_ct);
+ shift_ct = findName(p, pOpts, pOD, paz_names, name_ct);
+ if (shift_ct >= name_ct) {
+ pOD->optCookie = (void*)0;
+ return;
+ }
+ bit = 1UL << shift_ct;
}
if (iv)
res &= ~bit;
/*
- * $Id: environment.c,v 4.13 2007/04/15 19:01:18 bkorb Exp $
- * Time-stamp: "2007-04-15 11:50:35 bkorb"
+ * $Id: environment.c,v 4.19 2009/01/17 22:08:07 bkorb Exp $
+ * Time-stamp: "2009-01-12 05:52:44 bkorb"
*
* This file contains all of the routines that must be linked into
* an executable to use the generated option processing. The optional
* routines are in separately compiled modules so that they will not
* necessarily be linked in.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
*
- * Automated Options 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.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * These files have the following md5sums:
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static void
checkEnvOpt(tOptState * os, char * env_name,
tOptions* pOpts, teEnvPresetType type);
char** sv_argv;
/*
- * IF there is no such environment variable
- * *or* there is, but we are doing immediate opts and there are
- * no immediate opts to do (--help inside $PROGNAME is silly,
- * but --no-load-defs is not, so that is marked)
- * THEN bail out now. (
+ * No such beast? Then bail now.
*/
- if ( (pczOptStr == NULL)
- || ( (type == ENV_IMM)
- && ((pOpts->fOptSet & OPTPROC_HAS_IMMED) == 0) ) )
+ if (pczOptStr == NULL)
return;
/*
switch (type) {
case ENV_IMM:
- /*
- * We know the OPTPROC_HAS_IMMED bit is set.
- */
(void)doImmediateOpts( pOpts );
break;
- case ENV_NON_IMM:
- (void)doRegularOpts( pOpts );
- break;
+ case ENV_ALL:
+ (void)doImmediateOpts( pOpts );
+ pOpts->curOptIdx = 1;
+ pOpts->pzCurOpt = NULL;
+ /* FALLTHROUGH */
- default:
- /*
- * Only to immediate opts if the OPTPROC_HAS_IMMED bit is set.
- */
- if (pOpts->fOptSet & OPTPROC_HAS_IMMED) {
- (void)doImmediateOpts( pOpts );
- pOpts->curOptIdx = 1;
- pOpts->pzCurOpt = NULL;
- }
+ case ENV_NON_IMM:
(void)doRegularOpts( pOpts );
- break;
}
/*
--- /dev/null
+
+/*
+ * $Id: file.c,v 1.7 2009/01/01 16:51:47 bkorb Exp $
+ * Time-stamp: "2008-12-06 10:15:33 bkorb"
+ *
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
+ *
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
+ *
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
+ *
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
+ *
+ * These files have the following md5sums:
+ *
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
+ */
+
+/*=export_func optionFileCheck
+ * private:
+ *
+ * what: Decipher a boolean value
+ * arg: + tOptions* + pOpts + program options descriptor +
+ * arg: + tOptDesc* + pOptDesc + the descriptor for this arg +
+ * arg: + teOptFileType + ftype + File handling type +
+ * arg: + tuFileMode + mode + file open mode (if needed) +
+ *
+ * doc:
+ * Make sure the named file conforms with the file type mode.
+ * The mode specifies if the file must exist, must not exist or may
+ * (or may not) exist. The mode may also specify opening the
+ * file: don't, open just the descriptor (fd), or open as a stream
+ * (FILE* pointer).
+=*/
+void
+optionFileCheck(tOptions* pOpts, tOptDesc* pOD,
+ teOptFileType ftype, tuFileMode mode)
+{
+ if (pOpts <= OPTPROC_EMIT_LIMIT) {
+ if (pOpts != OPTPROC_EMIT_USAGE)
+ return;
+
+ switch (ftype & FTYPE_MODE_EXIST_MASK) {
+ case FTYPE_MODE_MUST_NOT_EXIST:
+ fputs(zFileCannotExist, option_usage_fp);
+ break;
+
+ case FTYPE_MODE_MUST_EXIST:
+ fputs(zFileMustExist, option_usage_fp);
+ break;
+ }
+ return;
+ }
+
+ if ((pOD->fOptState & OPTST_RESET) != 0) {
+ if (pOD->optCookie != NULL)
+ AGFREE(pOD->optCookie);
+ return;
+ }
+
+ {
+ struct stat sb;
+
+ errno = 0;
+
+ switch (ftype & FTYPE_MODE_EXIST_MASK) {
+ case FTYPE_MODE_MUST_NOT_EXIST:
+ if ( (stat(pOD->optArg.argString, &sb) == 0)
+ || (errno != ENOENT) ){
+ if (errno == 0)
+ errno = EINVAL;
+ fprintf(stderr, zFSOptError, errno, strerror(errno),
+ zFSOptErrNoExist, pOD->optArg.argString, pOD->pz_Name);
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ /* NOTREACHED */
+ }
+ /* FALLTHROUGH */
+
+ default:
+ case FTYPE_MODE_MAY_EXIST:
+ {
+ char * p = strrchr(pOD->optArg.argString, DIRCH);
+ if (p != NULL)
+ *p = NUL;
+ if ( (stat(pOD->optArg.argString, &sb) != 0)
+ || (errno = EINVAL, ! S_ISDIR(sb.st_mode)) ){
+ fprintf(stderr, zFSOptError, errno, strerror(errno),
+ zFSOptErrMayExist, pOD->optArg.argString, pOD->pz_Name);
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ /* NOTREACHED */
+ }
+ *p = '/';
+ break;
+ }
+
+ case FTYPE_MODE_MUST_EXIST:
+ if ( (stat(pOD->optArg.argString, &sb) != 0)
+ || (errno = EINVAL, ! S_ISREG(sb.st_mode)) ){
+ fprintf(stderr, zFSOptError, errno, strerror(errno),
+ zFSOptErrMustExist, pOD->optArg.argString,
+ pOD->pz_Name);
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ /* NOTREACHED */
+ }
+ break;
+ }
+ }
+
+ switch (ftype & FTYPE_MODE_OPEN_MASK) {
+ default:
+ case FTYPE_MODE_NO_OPEN:
+ break;
+
+ case FTYPE_MODE_OPEN_FD:
+ {
+ int fd = open(pOD->optArg.argString, mode.file_flags);
+ if (fd < 0) {
+ fprintf(stderr, zFSOptError, errno, strerror(errno),
+ zFSOptErrOpen, pOD->optArg.argString, pOD->pz_Name);
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ /* NOTREACHED */
+ }
+
+ if ((pOD->fOptState & OPTST_ALLOC_ARG) != 0)
+ pOD->optCookie = (void *)pOD->optArg.argString;
+ else
+ AGDUPSTR(pOD->optCookie, pOD->optArg.argString, "file name");
+
+ pOD->optArg.argFd = fd;
+ pOD->fOptState &= ~OPTST_ALLOC_ARG;
+ break;
+ }
+
+ case FTYPE_MODE_FOPEN_FP:
+ {
+ FILE* fp = fopen(pOD->optArg.argString, mode.file_mode);
+ if (fp == NULL) {
+ fprintf(stderr, zFSOptError, errno, strerror(errno),
+ zFSOptErrFopen, pOD->optArg.argString, pOD->pz_Name);
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ /* NOTREACHED */
+ }
+
+ if ((pOD->fOptState & OPTST_ALLOC_ARG) != 0)
+ pOD->optCookie = (void *)pOD->optArg.argString;
+ else
+ AGDUPSTR(pOD->optCookie, pOD->optArg.argString, "file name");
+
+ pOD->optArg.argFp = fp;
+ pOD->fOptState &= ~OPTST_ALLOC_ARG;
+ break;
+ }
+ }
+}
+/*
+ * Local Variables:
+ * mode: C
+ * c-file-style: "stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * end of autoopts/file.c */
*
* DO NOT EDIT THIS FILE (genshell.c)
*
- * It has been AutoGen-ed Saturday May 5, 2007 at 12:02:35 PM PDT
+ * It has been AutoGen-ed Saturday May 16, 2009 at 08:15:54 AM PDT
* From the definitions genshell.def
* and the template file options
*
- * Generated from AutoOpts 29:0:4 templates.
+ * Generated from AutoOpts @AO_CURRENT@:@AO_REVISION@:@AO_AGE@ templates.
*/
/*
*
* This source file is copyrighted and licensed under the following terms:
*
- * genshellopt copyright 1999-2007 Bruce Korb - all rights reserved
+ * genshellopt copyright 1999-2009 Bruce Korb - all rights reserved
*
- * genshellopt is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
+ * genshellopt 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.
*
- * genshellopt 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
- * Lesser General Public License for more details.
+ * genshellopt 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 Lesser General Public
- * License along with genshellopt. If not, write to:
- * The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301, USA.
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-
+#include <sys/types.h>
#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
#define OPTION_CODE_COMPILE 1
#include "genshell.h"
#ifdef __cplusplus
extern "C" {
#endif
+
+/* TRANSLATORS: choose the translation for option names wisely because you
+ cannot ever change your mind. */
tSCC zCopyright[] =
- "genshellopt copyright (c) 1999-2007 Bruce Korb, all rights reserved";
-tSCC zCopyrightNotice[] =
- "genshellopt is free software; you can redistribute it and/or\n\
-modify it under the terms of the GNU Lesser General Public\n\
-License as published by the Free Software Foundation; either\n\
-version 2.1 of the License, or (at your option) any later version.\n\n\
-genshellopt is distributed in the hope that it will be useful,\n\
-but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n\
-Lesser General Public License for more details.\n\n\
-You should have received a copy of the GNU Lesser General Public\n\
-License along with genshellopt. If not, write to:\n\
-\tThe Free Software Foundation, Inc.,\n\
-\t51 Franklin Street, Fifth Floor\n\
-\tBoston, MA 02110-1301, USA.";
+ "genshellopt copyright (c) 1999-2009 Bruce Korb, all rights reserved";
+tSCC zCopyrightNotice[610] =
+"genshellopt is free software: you can redistribute it and/or modify it under\n\
+the terms of the GNU General Public License as published by the Free Software\n\
+Foundation, either version 3 of the License, or (at your option) any later\n\
+version.\n\n\
+genshellopt is distributed in the hope that it will be useful, but WITHOUT ANY\n\
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n\
+PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\n\
+You should have received a copy of the GNU General Public License along with\n\
+this program. If not, see <http://www.gnu.org/licenses/>.";
+
extern tUsageProc genshelloptUsage;
#ifndef NULL
/*
* Help/More_Help/Version option descriptions:
*/
-tSCC zHelpText[] = "Display usage information and exit";
-tSCC zHelp_Name[] = "help";
-
-tSCC zMore_HelpText[] = "Extended usage information passed thru pager";
-tSCC zMore_Help_Name[] = "more-help";
-
-tSCC zVersionText[] = "Output version information and exit";
-tSCC zVersion_Name[] = "version";
+tSCC zHelpText[] = "Display usage information and exit";
+tSCC zHelp_Name[] = "help";
+tSCC zMore_HelpText[] = "Extended usage information passed thru pager";
+tSCC zMore_Help_Name[] = "more-help";
+tSCC zVersionText[] = "Output version information and exit";
+tSCC zVersion_Name[] = "version";
/*
* Declare option callback procedures
*/
text, the second line of the file through the ending tag will be replaced\n\
by the newly generated text. The first `#!' line will be regenerated.\n";
tSCC zFullVersion[] = GENSHELLOPT_FULL_VERSION;
-/* extracted from optcode.tpl near line 408 */
+/* extracted from optcode.tpl near line 501 */
#if defined(ENABLE_NLS)
# define OPTPROC_BASE OPTPROC_TRANSLATE
# define translate_option_strings NULL
#endif /* ENABLE_NLS */
+
+#define genshellopt_full_usage NULL
+#define genshellopt_short_usage NULL
tOptions genshelloptOptions = {
OPTIONS_STRUCT_VERSION,
0, NULL, /* original argc + argv */
/*
* Indexes to special options
*/
- { INDEX_OPT_MORE_HELP,
- 0 /* no option state saving */,
- NO_EQUIVALENT /* index of '-#' option */,
+ { INDEX_OPT_MORE_HELP, /* more-help option index */
+ NO_EQUIVALENT, /* save option index */
+ NO_EQUIVALENT, /* '-#' option index */
NO_EQUIVALENT /* index of default opt */
},
- 5 /* full option count */, 2 /* user option count */
+ 5 /* full option count */, 2 /* user option count */,
+ genshellopt_full_usage, genshellopt_short_usage,
+ NULL, NULL
};
/*
tOptions* pOptions,
tOptDesc* pOptDesc )
{
+ (void)pOptions;
USAGE( EXIT_SUCCESS );
}
-/* extracted from optcode.tpl near line 514 */
+/* extracted from optcode.tpl near line 633 */
#if ENABLE_NLS
#include <stdio.h>
* Guard against re-translation. It won't work. The strings will have
* been changed by the first pass through this code. One shot only.
*/
- if (option_usage_text.field_ct == 0)
- return;
- /*
- * Do the translations. The first pointer follows the field count field.
- * The field count field is the size of a pointer.
- */
- {
- char** ppz = (char**)(void*)&(option_usage_text);
- int ix = option_usage_text.field_ct;
+ if (option_usage_text.field_ct != 0) {
+
+ /*
+ * Do the translations. The first pointer follows the field count
+ * field. The field count field is the size of a pointer.
+ */
+ tOptDesc* pOD = genshelloptOptions.pOptDesc;
+ char** ppz = (char**)(void*)&(option_usage_text);
+ int ix = option_usage_text.field_ct;
do {
ppz++;
*ppz = AO_gettext(*ppz);
} while (--ix > 0);
+
+ COERSION(pzCopyright);
+ COERSION(pzCopyNotice);
+ COERSION(pzFullVersion);
+ COERSION(pzUsageTitle);
+ COERSION(pzExplain);
+ COERSION(pzDetail);
+ option_usage_text.field_ct = 0;
+
+ for (ix = genshelloptOptions.optCt; ix > 0; ix--, pOD++)
+ coerce_it((void*)&(pOD->pzText));
}
- option_usage_text.field_ct = 0;
- {
+ if ((genshelloptOptions.fOptSet & OPTPROC_NXLAT_OPT_CFG) == 0) {
tOptDesc* pOD = genshelloptOptions.pOptDesc;
- int ix = genshelloptOptions.optCt;
-
- for (;;) {
- pOD->pzText = AO_gettext(pOD->pzText);
- pOD->pz_NAME = AO_gettext(pOD->pz_NAME);
- pOD->pz_Name = AO_gettext(pOD->pz_Name);
- pOD->pz_DisableName = AO_gettext(pOD->pz_DisableName);
- pOD->pz_DisablePfx = AO_gettext(pOD->pz_DisablePfx);
- if (--ix <= 0)
- break;
- pOD++;
+ int ix;
+
+ for (ix = genshelloptOptions.optCt; ix > 0; ix--, pOD++) {
+ coerce_it((void*)&(pOD->pz_Name));
+ coerce_it((void*)&(pOD->pz_DisableName));
+ coerce_it((void*)&(pOD->pz_DisablePfx));
}
+ /* prevent re-translation */
+ genshelloptOptions.fOptSet |= OPTPROC_NXLAT_OPT_CFG | OPTPROC_NXLAT_OPT;
}
- COERSION(pzCopyright);
- COERSION(pzCopyNotice);
- COERSION(pzFullVersion);
- COERSION(pzUsageTitle);
- COERSION(pzExplain);
- COERSION(pzDetail);
}
#endif /* ENABLE_NLS */
*
* DO NOT EDIT THIS FILE (genshell.h)
*
- * It has been AutoGen-ed Saturday May 5, 2007 at 12:02:35 PM PDT
+ * It has been AutoGen-ed Saturday May 16, 2009 at 08:15:54 AM PDT
* From the definitions genshell.def
* and the template file options
*
- * Generated from AutoOpts 29:0:4 templates.
+ * Generated from AutoOpts @AO_CURRENT@:@AO_REVISION@:@AO_AGE@ templates.
*/
/*
*
* This source file is copyrighted and licensed under the following terms:
*
- * genshellopt copyright 1999-2007 Bruce Korb - all rights reserved
+ * genshellopt copyright 1999-2009 Bruce Korb - all rights reserved
*
- * genshellopt is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
+ * genshellopt 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.
*
- * genshellopt 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
- * Lesser General Public License for more details.
+ * genshellopt 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 Lesser General Public
- * License along with genshellopt. If not, write to:
- * The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301, USA.
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* This file contains the programmatic interface to the Automated
* "AutoOpts" chapter. Please refer to that doc for usage help.
*/
#ifndef AUTOOPTS_GENSHELL_H_GUARD
-#define AUTOOPTS_GENSHELL_H_GUARD
+#define AUTOOPTS_GENSHELL_H_GUARD 1
#include <autoopts/options.h>
/*
* tolerable version is at least as old as what was current when the header
* template was released.
*/
-#define AO_TEMPLATE_VERSION 118784
+#define AO_TEMPLATE_VERSION 131073
#if (AO_TEMPLATE_VERSION < OPTIONS_MINIMUM_VERSION) \
|| (AO_TEMPLATE_VERSION > OPTIONS_STRUCT_VERSION)
# error option template version mismatches autoopts/options.h header
* Enumeration of each option:
*/
typedef enum {
- INDEX_OPT_SCRIPT = 0,
- INDEX_OPT_SHELL = 1,
- INDEX_OPT_VERSION = 2,
- INDEX_OPT_HELP = 3,
- INDEX_OPT_MORE_HELP = 4
+ INDEX_OPT_SCRIPT = 0,
+ INDEX_OPT_SHELL = 1,
+ INDEX_OPT_VERSION = 2,
+ INDEX_OPT_HELP = 3,
+ INDEX_OPT_MORE_HELP = 4
} teOptIndex;
#define OPTION_CT 5
DESC(n).fOptState |= OPTST_DISABLED; \
DESC(n).optCookie = NULL )
-/*
+/* * * * * *
+ *
* Interface defines for specific options.
*/
#define VALUE_OPT_SCRIPT 'o'
#define VALUE_OPT_SHELL 's'
-
-#define VALUE_OPT_VERSION 'v'
#define VALUE_OPT_HELP '?'
#define VALUE_OPT_MORE_HELP '!'
+#define VALUE_OPT_VERSION 'v'
/*
* Interface defines not associated with particular options
*/
genshelloptOptions.pzCurOpt = NULL )
#define START_OPT RESTART_OPT(1)
#define USAGE(c) (*genshelloptOptions.pUsageProc)( &genshelloptOptions, c )
-/* extracted from opthead.tpl near line 360 */
+/* extracted from opthead.tpl near line 409 */
/* * * * * *
*
extern tOptions genshelloptOptions;
-#ifndef _
-# if ENABLE_NLS
-# include <stdio.h>
- static inline char* aoGetsText( char const* pz ) {
- if (pz == NULL) return NULL;
- return (char*)gettext( pz );
- }
-# define _(s) aoGetsText(s)
-# else /* ENABLE_NLS */
-# define _(s) s
-# endif /* ENABLE_NLS */
-#endif
+#if defined(ENABLE_NLS)
+# ifndef _
+# include <stdio.h>
+ static inline char* aoGetsText( char const* pz ) {
+ if (pz == NULL) return NULL;
+ return (char*)gettext( pz );
+ }
+# define _(s) aoGetsText(s)
+# endif /* _() */
+
+# define OPT_NO_XLAT_CFG_NAMES STMTS(genshelloptOptions.fOptSet |= \
+ OPTPROC_NXLAT_OPT_CFG;)
+# define OPT_NO_XLAT_OPT_NAMES STMTS(genshelloptOptions.fOptSet |= \
+ OPTPROC_NXLAT_OPT|OPTPROC_NXLAT_OPT_CFG;)
+
+# define OPT_XLAT_CFG_NAMES STMTS(genshelloptOptions.fOptSet &= \
+ ~(OPTPROC_NXLAT_OPT|OPTPROC_NXLAT_OPT_CFG);)
+# define OPT_XLAT_OPT_NAMES STMTS(genshelloptOptions.fOptSet &= \
+ ~OPTPROC_NXLAT_OPT;)
+
+#else /* ENABLE_NLS */
+# define OPT_NO_XLAT_CFG_NAMES
+# define OPT_NO_XLAT_OPT_NAMES
+
+# define OPT_XLAT_CFG_NAMES
+# define OPT_XLAT_OPT_NAMES
+
+# ifndef _
+# define _(_s) _s
+# endif
+#endif /* ENABLE_NLS */
#ifdef __cplusplus
}
#include "autoopts/options.h"
#include "autoopts/usage-txt.h"
#include "genshell.h"
+#include "xat-attribute.h"
+#include "value-type.h"
+#include "ag-char-map.h"
#include "autoopts.h"
#include "proto.h"
+#include "value-type.c"
+#include "xat-attribute.c"
#include "autoopts.c"
#include "boolean.c"
#include "configfile.c"
#include "cook.c"
#include "enumeration.c"
#include "environment.c"
+#include "file.c"
#include "genshell.c"
#include "load.c"
#include "makeshell.c"
#include "numeric.c"
#include "pgusage.c"
#include "putshell.c"
+#include "reset.c"
#include "restore.c"
#include "save.c"
#include "sort.c"
#include "streqvcmp.c"
#include "text_mmap.c"
#include "tokenize.c"
+#include "time.c"
#include "usage.c"
#include "version.c"
/*
- * $Id: load.c,v 4.20 2007/02/04 22:17:39 bkorb Exp $
- * Time-stamp: "2007-02-04 11:54:57 bkorb"
+ * $Id: load.c,v 4.28 2009/01/01 16:51:48 bkorb Exp $
+ * Time-stamp: "2008-12-06 10:16:05 bkorb"
*
* This file contains the routines that deal with processing text strings
* for options, either from a NUL-terminated string passed in or from an
* rc/ini file.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
+ * These files have the following md5sums:
*
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
tOptionLoadMode option_load_mode = OPTION_LOAD_UNCOOKED;
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static ag_bool
insertProgramPath(
char* pzBuf,
* ret-desc: AG_TRUE if the name was handled, otherwise AG_FALSE.
* If the name does not start with ``$'', then it is handled
* simply by copying the input name to the output buffer and
- * resolving the name with either @code{canonicalize_file_name(3GLIBC)}
- * or @code{realpath(3C)}.
+ * resolving the name with either
+ * @code{canonicalize_file_name(3GLIBC)} or @code{realpath(3C)}.
*
* doc:
*
* allocated and we need to deallocate it.
*/
if (pzPath != pzProgPath)
- free( (void*)pzPath );
+ AGFREE(pzPath);
return AG_TRUE;
}
for (;;) {
int ch = (int)*++pzName;
- if (! ISNAMECHAR( ch ))
+ if (! IS_VALUE_NAME_CHAR(ch))
break;
*(pzDir++) = (char)ch;
}
if (mode == OPTION_LOAD_KEEP)
return;
- if (isspace( (int)*pzTxt )) {
+ if (IS_WHITESPACE_CHAR(*pzTxt)) {
char* pzS = pzTxt;
char* pzD = pzTxt;
- while (isspace( (int)*++pzS )) ;
+ while (IS_WHITESPACE_CHAR(*++pzS)) ;
while ((*(pzD++) = *(pzS++)) != NUL) ;
pzE = pzD-1;
} else
pzE = pzTxt + strlen( pzTxt );
- while ((pzE > pzTxt) && isspace( (int)pzE[-1] )) pzE--;
+ while ((pzE > pzTxt) && IS_WHITESPACE_CHAR(pzE[-1])) pzE--;
*pzE = NUL;
if (mode == OPTION_LOAD_UNCOOKED)
static char*
assembleArgValue( char* pzTxt, tOptionLoadMode mode )
{
- tSCC zBrk[] = " \t:=";
+ tSCC zBrk[] = " \t\n:=";
char* pzEnd = strpbrk( pzTxt, zBrk );
int space_break;
* because we'll have to skip over an immediately following ':' or '='
* (and the white space following *that*).
*/
- space_break = isspace((int)*pzEnd);
+ space_break = IS_WHITESPACE_CHAR(*pzEnd);
*(pzEnd++) = NUL;
- while (isspace((int)*pzEnd)) pzEnd++;
+ while (IS_WHITESPACE_CHAR(*pzEnd)) pzEnd++;
if (space_break && ((*pzEnd == ':') || (*pzEnd == '=')))
- while (isspace((int)*++pzEnd)) ;
+ while (IS_WHITESPACE_CHAR(*++pzEnd)) ;
return pzEnd;
}
tDirection direction,
tOptionLoadMode load_mode )
{
- while (isspace( (int)*pzLine )) pzLine++;
+ while (IS_WHITESPACE_CHAR(*pzLine)) pzLine++;
{
char* pzArg = assembleArgValue( pzLine, load_mode );
dnl
dnl DO NOT EDIT THIS FILE (libopts.m4)
dnl
-dnl It has been AutoGen-ed Saturday May 5, 2007 at 12:02:37 PM PDT
+dnl It has been AutoGen-ed Saturday May 16, 2009 at 08:15:55 AM PDT
dnl From the definitions libopts.def
dnl and the template file conftest.tpl
dnl
AC_MSG_ERROR([You must have one of limits.h, sys/limits.h or values.h])
fi
+ # ----------------------------------------------------------------------
+ # check for various programs used during the build.
+ # On OS/X, "wchar.h" needs "runetype.h" to work properly.
+ # ----------------------------------------------------------------------
+ AC_CHECK_HEADERS([runetype.h wchar.h], [], [],[
+ AC_INCLUDES_DEFAULT
+ #if HAVE_RUNETYPE_H
+ # include <runetype.h>
+ #endif
+ ])
+
+ # ----------------------------------------------------------------------
+ # Checks for typedefs
+ # ----------------------------------------------------------------------
+ AC_CHECK_TYPES(wchar_t)
+ AC_CHECK_TYPES(wint_t, [], [], [
+ AC_INCLUDES_DEFAULT
+ #if HAVE_RUNETYPE_H
+ # include <runetype.h>
+ #endif
+ #if HAVE_WCHAR_H
+ # include <wchar.h>
+ #endif
+ ])
+
# ========================
# ...and int types headers
# ========================
AC_CHECK_HEADERS(stdint.h inttypes.h, break)
AC_CHECK_TYPES([int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t,
- intptr_t, uint_t])
+ intptr_t, uintptr_t, uint_t, pid_t, size_t])
- # ====================
- # uintptr type & sizes
- # ====================
- AC_CHECK_TYPES([uintptr_t], ,
- [AC_DEFINE([uintptr_t], unsigned long,
- [Alternate uintptr_t for systems without it.])])
+ # =====
+ # sizes
+ # =====
AC_CHECK_SIZEOF(char*, 4)
AC_CHECK_SIZEOF(int, 4)
AC_CHECK_SIZEOF(long, 4)
# ----------------------------------------------------------------------
AC_CHECK_LIB(gen, pathfind)
AC_FUNC_VPRINTF
- AC_CHECK_FUNCS([mmap canonicalize_file_name snprintf strdup strchr strrchr])
+ AC_CHECK_FUNCS([mmap canonicalize_file_name snprintf strdup strchr \
+ strrchr strsignal])
[ INVOKE_LIBOPTS_MACROS_FIRST_done=yes
fi]])
dnl @synopsis LIBOPTS_CHECK
dnl
-dnl Time-stamp: "2006-09-23 19:36:24 bkorb"
-dnl Last Committed: $Date: 2006/09/24 02:59:00 $
+dnl Time-stamp: "2007-07-04 11:41:40 bkorb"
+dnl Last Committed: $Date: 2007/07/04 20:51:20 $
dnl
dnl If autoopts-config works, add the linking information to LIBS.
dnl Otherwise, add ``libopts-${ao_rev}'' to SUBDIRS and run all
dnl the config tests that the library needs. Invoke the
dnl "INVOKE_LIBOPTS_MACROS" macro iff we are building libopts.
dnl
+dnl This file is part of AutoGen.
+dnl AutoGen copyright (c) 1992-2007 Bruce Korb - all rights reserved
+dnl
+dnl AutoGen is free software: you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation, either version 3 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl AutoGen is distributed in the hope that it will be useful, but
+dnl WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+dnl See the GNU General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License along
+dnl with this program. If not, see <http://www.gnu.org/licenses/>.
+dnl
dnl Default to system libopts
dnl
AC_DEFUN([LIBOPTS_CHECK],[
# liboptschk.m4 serial 1 (autogen - 5.7.3)
-dnl Copyright (C) 2005 Free Software Foundation, Inc.
+dnl copyright (c) 2005 by Bruce Korb - all rights reserved
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
dnl Time-stamp: "2006-09-23 19:42:31 bkorb"
-dnl Last Committed: $Date: 2006/09/24 02:59:00 $
+dnl Last Committed: $Date: 2007/07/04 20:51:18 $
dnl This file can can be used in projects which are not available under
dnl the GNU General Public License or the GNU Library General Public
/*
- * $Id: makeshell.c,v 4.20 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2007-01-27 06:05:45 bkorb"
+ * $Id: makeshell.c,v 4.28 2009/01/01 16:51:48 bkorb Exp $
+ * Time-stamp: "2008-07-26 16:10:51 bkorb"
*
* This module will interpret the options set in the tOptions
* structure and create a Bourne shell script capable of parsing them.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
+ * These files have the following md5sums:
*
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
tOptions* pShellParseOptions = NULL;
static char* pzTrailer = NULL;
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static void
textToVariable( tOptions* pOpts, teTextTo whichVar, tOptDesc* pOD );
*/
switch (OPTST_GET_ARGTYPE(pOptDesc->fOptState)) {
case OPARG_TYPE_ENUMERATION:
- (*(pOptDesc->pOptProc))( (tOptions*)2UL, pOptDesc );
+ (*(pOptDesc->pOptProc))(OPTPROC_EMIT_SHELL, pOptDesc );
pzDefault = pOptDesc->optArg.argString;
break;
if (SKIP_OPT(pOptDesc))
continue;
- if (isprint( pOptDesc->optValue )) {
+ if (IS_GRAPHIC_CHAR(pOptDesc->optValue)) {
printf( zOptionFlag, pOptDesc->optValue );
printOptionAction( pOpts, pOptDesc );
}
/*
- * $Id: nested.c,v 4.14 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2007-01-26 11:04:35 bkorb"
+ * $Id: nested.c,v 4.27 2009/01/01 16:51:48 bkorb Exp $
+ * Time-stamp: "2008-07-28 19:18:28 bkorb"
*
* Automated Options Nested Values module.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
+ * These files have the following md5sums:
*
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
+
+typedef struct {
+ int xml_ch;
+ int xml_len;
+ char xml_txt[8];
+} xml_xlate_t;
+
+static xml_xlate_t const xml_xlate[] = {
+ { '&', 4, "amp;" },
+ { '<', 3, "lt;" },
+ { '>', 3, "gt;" },
+ { '"', 5, "quot;" },
+ { '\'',5, "apos;" }
+};
+
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static void
-removeBackslashes( char* pzSrc );
+removeLineContinue( char* pzSrc );
static char const*
scanQuotedString( char const* pzTxt );
sortNestedList( tArgList* pAL );
/* = = = END-STATIC-FORWARD = = = */
-/* removeBackslashes
+/* removeLineContinue
*
- * This function assumes that all newline characters were preceeded by
- * backslashes that need removal.
+ * Backslashes are used for line continuations. We keep the newline
+ * characters, but trim out the backslash:
*/
static void
-removeBackslashes( char* pzSrc )
+removeLineContinue( char* pzSrc )
{
- char* pzD = strchr(pzSrc, '\n');
+ char* pzD;
- if (pzD == NULL)
- return;
- *--pzD = '\n';
+ do {
+ while (*pzSrc == '\n') pzSrc++;
+ pzD = strchr(pzSrc, '\n');
+ if (pzD == NULL)
+ return;
+ /*
+ * pzD has skipped at least one non-newline character and now
+ * points to a newline character. It now becomes the source and
+ * pzD goes to the previous character.
+ */
+ pzSrc = pzD--;
+ if (*pzD != '\\')
+ pzD++;
+ } while (pzD == pzSrc);
+
+ /*
+ * Start shifting text.
+ */
for (;;) {
char ch = ((*pzD++) = *(pzSrc++));
switch (ch) {
- case '\n': *--pzD = ch; break;
case NUL: return;
- default:
- ;
+ case '\\':
+ if (*pzSrc == '\n')
+ --pzD; /* rewrite on next iteration */
}
}
}
} else {
pNV->valType = OPARG_TYPE_STRING;
- if (dataLen > 0)
- memcpy( pNV->v.strVal, pzValue, dataLen );
- pNV->v.strVal[dataLen] = NUL;
+ if (dataLen > 0) {
+ char const * pzSrc = pzValue;
+ char * pzDst = pNV->v.strVal;
+ int ct = dataLen;
+ do {
+ int ch = *(pzSrc++) & 0xFF;
+ if (ch == NUL) goto data_copy_done;
+ if (ch == '&')
+ ch = get_special_char(&pzSrc, &ct);
+ *(pzDst++) = ch;
+ } while (--ct > 0);
+ data_copy_done:
+ *pzDst = NUL;
+
+ } else {
+ pNV->v.strVal[0] = NUL;
+ }
+
pNV->pzName = pNV->v.strVal + dataLen + 1;
}
pNV = AGALOC( sz, "option name/bool value pair" );
if (pNV == NULL)
return NULL;
- while (isspace( (int)*pzValue ) && (dataLen > 0)) {
+ while (IS_WHITESPACE_CHAR(*pzValue) && (dataLen > 0)) {
dataLen--; pzValue++;
}
if (dataLen == 0)
pNV->v.boolVal = 0;
- else if (isdigit( (int)*pzValue ))
- pNV->v.boolVal = atoi( pzValue );
- else switch (*pzValue) {
- case 'f':
- case 'F':
- case 'n':
- case 'N':
- pNV->v.boolVal = 0; break;
- default:
- pNV->v.boolVal = 1;
- }
+
+ else if (IS_DEC_DIGIT_CHAR(*pzValue))
+ pNV->v.boolVal = atoi(pzValue);
+
+ else pNV->v.boolVal = ! IS_FALSE_TYPE_CHAR(*pzValue);
pNV->valType = OPARG_TYPE_BOOLEAN;
pNV->pzName = (char*)(pNV + 1);
pNV = AGALOC( sz, "option name/bool value pair" );
if (pNV == NULL)
return NULL;
- while (isspace( (int)*pzValue ) && (dataLen > 0)) {
+ while (IS_WHITESPACE_CHAR(*pzValue) && (dataLen > 0)) {
dataLen--; pzValue++;
}
if (dataLen == 0)
- pNV->v.boolVal = 0;
+ pNV->v.longVal = 0;
else
- pNV->v.boolVal = atoi( pzValue );
+ pNV->v.longVal = strtol(pzValue, 0, 0);
pNV->valType = OPARG_TYPE_NUMERIC;
- pNV->pzName = (char*)(pNV + 1);
+ pNV->pzName = (char*)(pNV + 1);
memcpy( pNV->pzName, pzName, nameLen );
pNV->pzName[ nameLen ] = NUL;
addArgListEntry( pp, pNV );
scanNameEntry(char const* pzName, tOptionValue* pRes)
{
tOptionValue* pNV;
- char const * pzScan = pzName+1;
+ char const * pzScan = pzName+1; /* we know first char is a name char */
char const * pzVal;
size_t nameLen = 1;
size_t dataLen = 0;
- while (ISNAMECHAR( (int)*pzScan )) { pzScan++; nameLen++; }
-
- while (isspace( (int)*pzScan )) {
- char ch = *(pzScan++);
- if ((ch == '\n') || (ch == ',')) {
- addStringValue(&(pRes->v.nestVal), pzName, nameLen, NULL,(size_t)0);
- return pzScan - 1;
- }
- }
+ /*
+ * Scan over characters that name a value. These names may not end
+ * with a colon, but they may contain colons.
+ */
+ while (IS_VALUE_NAME_CHAR(*pzScan)) { pzScan++; nameLen++; }
+ if (pzScan[-1] == ':') { pzScan--; nameLen--; }
+ while (IS_HORIZ_WHITE_CHAR(*pzScan)) pzScan++;
+re_switch:
switch (*pzScan) {
case '=':
case ':':
- while (isspace( (int)*++pzScan )) ;
- switch (*pzScan) {
- case ',': goto comma_char;
- case '"':
- case '\'': goto quote_char;
- case NUL: goto nul_byte;
- default: goto default_char;
- }
+ while (IS_HORIZ_WHITE_CHAR( (int)*++pzScan )) ;
+ if ((*pzScan == '=') || (*pzScan == ':'))
+ goto default_char;
+ goto re_switch;
+ case '\n':
case ',':
- comma_char:
pzScan++;
/* FALLTHROUGH */
case NUL:
- nul_byte:
addStringValue(&(pRes->v.nestVal), pzName, nameLen, NULL, (size_t)0);
break;
case '"':
case '\'':
- quote_char:
pzVal = pzScan;
pzScan = scanQuotedString( pzScan );
dataLen = pzScan - pzVal;
pNV = addStringValue( &(pRes->v.nestVal), pzName, nameLen,
pzVal, dataLen );
if (pNV != NULL)
- removeBackslashes( pNV->v.strVal );
+ removeLineContinue( pNV->v.strVal );
goto leave_scan_name;
}
}
tOptionValue* pNewVal;
tOptionLoadMode save_mode = option_load_mode;
- if (! isalpha((int)*pzName)) {
+ if (! IS_VAR_FIRST_CHAR(*pzName)) {
switch (*pzName) {
default:
pzName = NULL;
return pzName;
}
- while (isalpha( (int)*++pzScan )) nameLen++;
+ pzScan++;
+ while (IS_VALUE_NAME_CHAR( (int)*pzScan )) { pzScan++; nameLen++; }
if (nameLen > 64)
return NULL;
valu.valType = OPARG_TYPE_STRING;
}
addStringValue(&(pRes->v.nestVal), pzName, nameLen, NULL, (size_t)0);
option_load_mode = save_mode;
- return pzScan+2;
+ return pzScan+1;
default:
option_load_mode = save_mode;
}
valLen = (pzScan - pzVal);
pzScan += nameLen + 3;
- while (isspace( (int)*pzScan )) pzScan++;
+ while (IS_WHITESPACE_CHAR(*pzScan)) pzScan++;
}
switch (valu.valType) {
errno = EINVAL;
return NULL;
}
- while (isspace( (int)*pzTxt )) pzTxt++;
+ while (IS_WHITESPACE_CHAR(*pzTxt)) pzTxt++;
if (*pzTxt == NUL) {
errno = ENOENT;
return NULL;
* Scan until we hit a NUL.
*/
do {
- while (isspace( (int)*pzTxt )) pzTxt++;
- if (isalpha( (int)*pzTxt )) {
+ while (IS_WHITESPACE_CHAR( (int)*pzTxt )) pzTxt++;
+ if (IS_VAR_FIRST_CHAR( (int)*pzTxt )) {
pzTxt = scanNameEntry( pzTxt, pRes );
}
else switch (*pzTxt) {
case NUL: goto scan_done;
case '<': pzTxt = scanXmlEntry( pzTxt, pRes );
+ if (pzTxt == NULL) goto woops;
if (*pzTxt == ',') pzTxt++; break;
case '#': pzTxt = strchr( pzTxt, '\n' ); break;
default: goto woops;
* Nested value was found on the command line
=*/
void
-optionNestedVal( tOptions* pOpts, tOptDesc* pOD )
+optionNestedVal(tOptions* pOpts, tOptDesc* pOD)
{
- tOptionValue* pOV = optionLoadNested(
- pOD->optArg.argString, pOD->pz_Name, strlen(pOD->pz_Name));
+ if (pOpts < OPTPROC_EMIT_LIMIT)
+ return;
+
+ if (pOD->fOptState & OPTST_RESET) {
+ tArgList* pAL = pOD->optCookie;
+ int ct;
+ tCC ** av;
+
+ if (pAL == NULL)
+ return;
+ ct = pAL->useCt;
+ av = pAL->apzArgs;
+
+ while (--ct >= 0) {
+ void * p = (void *)*(av++);
+ optionUnloadNested((tOptionValue const *)p);
+ }
+
+ AGFREE(pOD->optCookie);
- if (pOV != NULL)
- addArgListEntry( &(pOD->optCookie), (void*)pOV );
+ } else {
+ tOptionValue* pOV = optionLoadNested(
+ pOD->optArg.argString, pOD->pz_Name, strlen(pOD->pz_Name));
+
+ if (pOV != NULL)
+ addArgListEntry( &(pOD->optCookie), (void*)pOV );
+ }
}
+
+
+/*
+ * get_special_char
+ */
+LOCAL int
+get_special_char(char const ** ppz, int * ct)
+{
+ char const * pz = *ppz;
+
+ if (*ct < 3)
+ return '&';
+
+ if (*pz == '#') {
+ int base = 10;
+ int retch;
+
+ pz++;
+ if (*pz == 'x') {
+ base = 16;
+ pz++;
+ }
+ retch = (int)strtoul(pz, (char **)&pz, base);
+ if (*pz != ';')
+ return '&';
+ base = ++pz - *ppz;
+ if (base > *ct)
+ return '&';
+
+ *ct -= base;
+ *ppz = pz;
+ return retch;
+ }
+
+ {
+ int ctr = sizeof(xml_xlate) / sizeof(xml_xlate[0]);
+ xml_xlate_t const * xlatp = xml_xlate;
+
+ for (;;) {
+ if ( (*ct >= xlatp->xml_len)
+ && (strncmp(pz, xlatp->xml_txt, xlatp->xml_len) == 0)) {
+ *ppz += xlatp->xml_len;
+ *ct -= xlatp->xml_len;
+ return xlatp->xml_ch;
+ }
+
+ if (--ctr <= 0)
+ break;
+ xlatp++;
+ }
+ }
+ return '&';
+}
+
+
+/*
+ * emit_special_char
+ */
+LOCAL void
+emit_special_char(FILE * fp, int ch)
+{
+ int ctr = sizeof(xml_xlate) / sizeof(xml_xlate[0]);
+ xml_xlate_t const * xlatp = xml_xlate;
+
+ putc('&', fp);
+ for (;;) {
+ if (ch == xlatp->xml_ch) {
+ fputs(xlatp->xml_txt, fp);
+ return;
+ }
+ if (--ctr <= 0)
+ break;
+ xlatp++;
+ }
+ fprintf(fp, "#x%02X;", (ch & 0xFF));
+}
+
/*
* Local Variables:
* mode: C
/*
- * $Id: numeric.c,v 4.11 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2007-01-13 10:28:20 bkorb"
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
+ * $Id: numeric.c,v 4.21 2009/01/17 22:08:07 bkorb Exp $
+ * Time-stamp: "2009-01-11 18:05:28 bkorb"
*
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * Automated Options 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.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * These files have the following md5sums:
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
+ */
+
+/*=export_func optionShowRange
+ * private:
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
+ * what:
+ * arg: + tOptions* + pOpts + program options descriptor +
+ * arg: + tOptDesc* + pOptDesc + the descriptor for this arg +
+ * arg: + void * + rng_table + the value range tables +
+ * arg: + int + rng_count + the number of entries +
*
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
- */
+ * doc:
+ * Show information about a numeric option with range constraints.
+=*/
+void
+optionShowRange(tOptions* pOpts, tOptDesc* pOD, void * rng_table, int rng_ct)
+{
+ static char const bullet[] = "\t\t\t\t- ";
+ static char const deepin[] = "\t\t\t\t ";
+ static char const onetab[] = "\t";
+
+ const struct {long const rmin, rmax;} * rng = rng_table;
+
+ char const * pz_indent =
+ (pOpts != OPTPROC_EMIT_USAGE) ? onetab : bullet;
+
+ if ((pOpts == OPTPROC_EMIT_USAGE) || (pOpts > OPTPROC_EMIT_LIMIT)) {
+ char const * lie_in_range = zRangeLie;
+
+ if (pOpts > OPTPROC_EMIT_LIMIT) {
+ fprintf(option_usage_fp, zRangeErr,
+ pOpts->pzProgName, pOD->pz_Name, pOD->optArg.argString);
+ fprintf(option_usage_fp, "The %s option:\n", pOD->pz_Name);
+ lie_in_range = zRangeBadLie;
+ pz_indent = "";
+ }
+
+ if (pOD->fOptState & OPTST_SCALED_NUM)
+ fprintf(option_usage_fp, zRangeScaled, pz_indent);
+
+ if (rng_ct > 1) {
+ fprintf(option_usage_fp, lie_in_range, pz_indent);
+ pz_indent =
+ (pOpts != OPTPROC_EMIT_USAGE) ? onetab : deepin;
+
+ } else {
+ fprintf(option_usage_fp, zRangeOnly, pz_indent);
+ pz_indent = onetab + 1; /* empty string */
+ }
+
+ for (;;) {
+ if (rng->rmax == LONG_MIN)
+ fprintf(option_usage_fp, zRangeExact, pz_indent, rng->rmin);
+ else if (rng->rmin == LONG_MIN)
+ fprintf(option_usage_fp, zRangeUpto, pz_indent, rng->rmax);
+ else if (rng->rmax == LONG_MAX)
+ fprintf(option_usage_fp, zRangeAbove, pz_indent, rng->rmin);
+ else
+ fprintf(option_usage_fp, zRange, pz_indent, rng->rmin,
+ rng->rmax);
+
+ if (--rng_ct <= 0) {
+ fputc('\n', option_usage_fp);
+ break;
+ }
+ fputs(zRangeOr, option_usage_fp);
+ rng++;
+ pz_indent =
+ (pOpts != OPTPROC_EMIT_USAGE) ? onetab : deepin;
+ }
+
+ if (pOpts > OPTPROC_EMIT_LIMIT)
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ }
+}
+
/*=export_func optionNumericVal
* private:
*
- * what: Decipher a boolean value
+ * what: process an option with a numeric value.
* arg: + tOptions* + pOpts + program options descriptor +
* arg: + tOptDesc* + pOptDesc + the descriptor for this arg +
*
* Decipher a numeric value.
=*/
void
-optionNumericVal( tOptions* pOpts, tOptDesc* pOD )
+optionNumericVal(tOptions* pOpts, tOptDesc* pOD )
{
char* pz;
long val;
+ if ((pOD->fOptState & OPTST_RESET) != 0)
+ return;
+
/*
* Numeric options may have a range associated with it.
* If it does, the usage procedure requests that it be
if ((pOD == NULL) || (pOD->optArg.argString == NULL))
return;
- val = strtol( pOD->optArg.argString, &pz, 0 );
- if (*pz != NUL) {
- fprintf( stderr, zNotNumber, pOpts->pzProgName, pOD->optArg.argString );
- (*(pOpts->pUsageProc))(pOpts, EXIT_FAILURE);
- }
+ errno = 0;
+ val = strtol(pOD->optArg.argString, &pz, 0);
+ if ((pz == pOD->optArg.argString) || (errno != 0))
+ goto bad_number;
+
+ if ((pOD->fOptState & OPTST_SCALED_NUM) != 0)
+ switch (*(pz++)) {
+ case '\0': pz--; break;
+ case 't': val *= 1000;
+ case 'g': val *= 1000;
+ case 'm': val *= 1000;
+ case 'k': val *= 1000; break;
+
+ case 'T': val *= 1024;
+ case 'G': val *= 1024;
+ case 'M': val *= 1024;
+ case 'K': val *= 1024; break;
+
+ default: goto bad_number;
+ }
+
+ if (*pz != NUL)
+ goto bad_number;
if (pOD->fOptState & OPTST_ALLOC_ARG) {
AGFREE(pOD->optArg.argString);
}
pOD->optArg.argInt = val;
+ return;
+
+bad_number:
+ fprintf( stderr, zNotNumber, pOpts->pzProgName, pOD->optArg.argString );
+ if ((pOpts->fOptSet & OPTPROC_ERRSTOP) != 0)
+ (*(pOpts->pUsageProc))(pOpts, EXIT_FAILURE);
+
+ pOD->optArg.argInt = ~0;
}
+
/*
* Local Variables:
* mode: C
--- /dev/null
+/* Parse a time duration and return a seconds count
+ Copyright (C) 2008 Free Software Foundation, Inc.
+ Written by Bruce Korb <bkorb@gnu.org>, 2008.
+
+ 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 <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "parse-duration.h"
+
+#ifndef _
+#define _(_s) _s
+#endif
+
+#ifndef NUL
+#define NUL '\0'
+#endif
+
+#define cch_t char const
+
+typedef enum {
+ NOTHING_IS_DONE,
+ YEAR_IS_DONE,
+ MONTH_IS_DONE,
+ WEEK_IS_DONE,
+ DAY_IS_DONE,
+ HOUR_IS_DONE,
+ MINUTE_IS_DONE,
+ SECOND_IS_DONE
+} whats_done_t;
+
+#define SEC_PER_MIN 60
+#define SEC_PER_HR (SEC_PER_MIN * 60)
+#define SEC_PER_DAY (SEC_PER_HR * 24)
+#define SEC_PER_WEEK (SEC_PER_DAY * 7)
+#define SEC_PER_MONTH (SEC_PER_DAY * 30)
+#define SEC_PER_YEAR (SEC_PER_DAY * 365)
+
+#define TIME_MAX 0x7FFFFFFF
+
+static unsigned long inline
+str_const_to_ul (cch_t * str, cch_t ** ppz, int base)
+{
+ return strtoul (str, (char **)ppz, base);
+}
+
+static long inline
+str_const_to_l (cch_t * str, cch_t ** ppz, int base)
+{
+ return strtol (str, (char **)ppz, base);
+}
+
+static time_t inline
+scale_n_add (time_t base, time_t val, int scale)
+{
+ if (base == BAD_TIME)
+ {
+ if (errno == 0)
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ if (val > TIME_MAX / scale)
+ {
+ errno = ERANGE;
+ return BAD_TIME;
+ }
+
+ val *= scale;
+ if (base > TIME_MAX - val)
+ {
+ errno = ERANGE;
+ return BAD_TIME;
+ }
+
+ return base + val;
+}
+
+static time_t
+parse_hr_min_sec (time_t start, cch_t * pz)
+{
+ int lpct = 0;
+
+ errno = 0;
+
+ /* For as long as our scanner pointer points to a colon *AND*
+ we've not looped before, then keep looping. (two iterations max) */
+ while ((*pz == ':') && (lpct++ <= 1))
+ {
+ unsigned long v = str_const_to_ul (pz+1, &pz, 10);
+
+ if (errno != 0)
+ return BAD_TIME;
+
+ start = scale_n_add (v, start, 60);
+
+ if (errno != 0)
+ return BAD_TIME;
+ }
+
+ /* allow for trailing spaces */
+ while (isspace ((unsigned char)*pz)) pz++;
+ if (*pz != NUL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ return start;
+}
+
+static time_t
+parse_scaled_value (time_t base, cch_t ** ppz, cch_t * endp, int scale)
+{
+ cch_t * pz = *ppz;
+ time_t val;
+
+ if (base == BAD_TIME)
+ return base;
+
+ errno = 0;
+ val = str_const_to_ul (pz, &pz, 10);
+ if (errno != 0)
+ return BAD_TIME;
+ while (isspace ((unsigned char)*pz)) pz++;
+ if (pz != endp)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ *ppz = pz;
+ return scale_n_add (base, val, scale);
+}
+
+static time_t
+parse_year_month_day (cch_t * pz, cch_t * ps)
+{
+ time_t res = 0;
+
+ res = parse_scaled_value (0, &pz, ps, SEC_PER_YEAR);
+
+ ps = strchr (++pz, '-');
+ if (ps == NULL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_MONTH);
+
+ pz++;
+ ps = pz + strlen (pz);
+ return parse_scaled_value (res, &pz, ps, SEC_PER_DAY);
+}
+
+static time_t
+parse_yearmonthday (cch_t * in_pz)
+{
+ time_t res = 0;
+ char buf[8];
+ cch_t * pz;
+
+ if (strlen (in_pz) != 8)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ memcpy (buf, in_pz, 4);
+ buf[4] = NUL;
+ pz = buf;
+ res = parse_scaled_value (0, &pz, buf + 4, SEC_PER_YEAR);
+
+ memcpy (buf, in_pz + 4, 2);
+ buf[2] = NUL;
+ pz = buf;
+ res = parse_scaled_value (res, &pz, buf + 2, SEC_PER_MONTH);
+
+ memcpy (buf, in_pz + 6, 2);
+ buf[2] = NUL;
+ pz = buf;
+ return parse_scaled_value (res, &pz, buf + 2, SEC_PER_DAY);
+}
+
+static time_t
+parse_YMWD (cch_t * pz)
+{
+ time_t res = 0;
+ cch_t * ps = strchr (pz, 'Y');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (0, &pz, ps, SEC_PER_YEAR);
+ pz++;
+ }
+
+ ps = strchr (pz, 'M');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_MONTH);
+ pz++;
+ }
+
+ ps = strchr (pz, 'W');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_WEEK);
+ pz++;
+ }
+
+ ps = strchr (pz, 'D');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_DAY);
+ pz++;
+ }
+
+ while (isspace ((unsigned char)*pz)) pz++;
+ if (*pz != NUL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ return res;
+}
+
+static time_t
+parse_hour_minute_second (cch_t * pz, cch_t * ps)
+{
+ time_t res = 0;
+
+ res = parse_scaled_value (0, &pz, ps, SEC_PER_HR);
+
+ ps = strchr (++pz, ':');
+ if (ps == NULL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_MIN);
+
+ pz++;
+ ps = pz + strlen (pz);
+ return parse_scaled_value (res, &pz, ps, 1);
+}
+
+static time_t
+parse_hourminutesecond (cch_t * in_pz)
+{
+ time_t res = 0;
+ char buf[4];
+ cch_t * pz;
+
+ if (strlen (in_pz) != 6)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ memcpy (buf, in_pz, 2);
+ buf[2] = NUL;
+ pz = buf;
+ res = parse_scaled_value (0, &pz, buf + 2, SEC_PER_HR);
+
+ memcpy (buf, in_pz + 2, 2);
+ buf[2] = NUL;
+ pz = buf;
+ res = parse_scaled_value (res, &pz, buf + 2, SEC_PER_MIN);
+
+ memcpy (buf, in_pz + 4, 2);
+ buf[2] = NUL;
+ pz = buf;
+ return parse_scaled_value (res, &pz, buf + 2, 1);
+}
+
+static time_t
+parse_HMS (cch_t * pz)
+{
+ time_t res = 0;
+ cch_t * ps = strchr (pz, 'H');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (0, &pz, ps, SEC_PER_HR);
+ pz++;
+ }
+
+ ps = strchr (pz, 'M');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_MIN);
+ pz++;
+ }
+
+ ps = strchr (pz, 'S');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, 1);
+ pz++;
+ }
+
+ while (isspace ((unsigned char)*pz)) pz++;
+ if (*pz != NUL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ return res;
+}
+
+static time_t
+parse_time (cch_t * pz)
+{
+ cch_t * ps;
+ time_t res = 0;
+
+ /*
+ * Scan for a hyphen
+ */
+ ps = strchr (pz, ':');
+ if (ps != NULL)
+ {
+ res = parse_hour_minute_second (pz, ps);
+ }
+
+ /*
+ * Try for a 'H', 'M' or 'S' suffix
+ */
+ else if (ps = strpbrk (pz, "HMS"),
+ ps == NULL)
+ {
+ /* Its a YYYYMMDD format: */
+ res = parse_hourminutesecond (pz);
+ }
+
+ else
+ res = parse_HMS (pz);
+
+ return res;
+}
+
+static char *
+trim(char * pz)
+{
+ /* trim leading white space */
+ while (isspace ((unsigned char)*pz)) pz++;
+
+ /* trim trailing white space */
+ {
+ char * pe = pz + strlen (pz);
+ while ((pe > pz) && isspace ((unsigned char)pe[-1])) pe--;
+ *pe = NUL;
+ }
+
+ return pz;
+}
+
+/*
+ * Parse the year/months/days of a time period
+ */
+static time_t
+parse_period (cch_t * in_pz)
+{
+ char * pz = xstrdup (in_pz);
+ char * pT = strchr (pz, 'T');
+ char * ps;
+ void * fptr = pz;
+ time_t res = 0;
+
+ if (pT != NUL)
+ {
+ *(pT++) = NUL;
+ pz = trim (pz);
+ pT = trim (pT);
+ }
+
+ /*
+ * Scan for a hyphen
+ */
+ ps = strchr (pz, '-');
+ if (ps != NULL)
+ {
+ res = parse_year_month_day (pz, ps);
+ }
+
+ /*
+ * Try for a 'Y', 'M' or 'D' suffix
+ */
+ else if (ps = strpbrk (pz, "YMWD"),
+ ps == NULL)
+ {
+ /* Its a YYYYMMDD format: */
+ res = parse_yearmonthday (pz);
+ }
+
+ else
+ res = parse_YMWD (pz);
+
+ if ((errno == 0) && (pT != NULL))
+ {
+ time_t val = parse_time (pT);
+ res = scale_n_add (res, val, 1);
+ }
+
+ free (fptr);
+ return res;
+}
+
+static time_t
+parse_non_iso8601(cch_t * pz)
+{
+ whats_done_t whatd_we_do = NOTHING_IS_DONE;
+
+ time_t res = 0;
+
+ do {
+ time_t val;
+
+ errno = 0;
+ val = str_const_to_l (pz, &pz, 10);
+ if (errno != 0)
+ goto bad_time;
+
+ /* IF we find a colon, then we're going to have a seconds value.
+ We will not loop here any more. We cannot already have parsed
+ a minute value and if we've parsed an hour value, then the result
+ value has to be less than an hour. */
+ if (*pz == ':')
+ {
+ if (whatd_we_do >= MINUTE_IS_DONE)
+ break;
+
+ val = parse_hr_min_sec (val, pz);
+
+ if ((whatd_we_do == HOUR_IS_DONE) && (val >= SEC_PER_HR))
+ break;
+
+ return scale_n_add (res, val, 1);
+ }
+
+ {
+ unsigned int mult;
+
+ /* Skip over white space following the number we just parsed. */
+ while (isspace ((unsigned char)*pz)) pz++;
+
+ switch (*pz)
+ {
+ default: goto bad_time;
+ case NUL:
+ return scale_n_add (res, val, 1);
+
+ case 'y': case 'Y':
+ if (whatd_we_do >= YEAR_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_YEAR;
+ whatd_we_do = YEAR_IS_DONE;
+ break;
+
+ case 'M':
+ if (whatd_we_do >= MONTH_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_MONTH;
+ whatd_we_do = MONTH_IS_DONE;
+ break;
+
+ case 'W':
+ if (whatd_we_do >= WEEK_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_WEEK;
+ whatd_we_do = WEEK_IS_DONE;
+ break;
+
+ case 'd': case 'D':
+ if (whatd_we_do >= DAY_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_DAY;
+ whatd_we_do = DAY_IS_DONE;
+ break;
+
+ case 'h':
+ if (whatd_we_do >= HOUR_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_HR;
+ whatd_we_do = HOUR_IS_DONE;
+ break;
+
+ case 'm':
+ if (whatd_we_do >= MINUTE_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_MIN;
+ whatd_we_do = MINUTE_IS_DONE;
+ break;
+
+ case 's':
+ mult = 1;
+ whatd_we_do = SECOND_IS_DONE;
+ break;
+ }
+
+ res = scale_n_add (res, val, mult);
+
+ while (isspace ((unsigned char)*++pz)) ;
+ if (*pz == NUL)
+ return res;
+
+ if (! isdigit ((unsigned char)*pz))
+ break;
+ }
+
+ } while (whatd_we_do < SECOND_IS_DONE);
+
+ bad_time:
+ errno = EINVAL;
+ return BAD_TIME;
+}
+
+time_t
+parse_duration (char const * pz)
+{
+ time_t res = 0;
+
+ while (isspace ((unsigned char)*pz)) pz++;
+
+ do {
+ if (*pz == 'P')
+ {
+ res = parse_period (pz + 1);
+ if ((errno != 0) || (res == BAD_TIME))
+ break;
+ return res;
+ }
+
+ if (*pz == 'T')
+ {
+ res = parse_time (pz + 1);
+ if ((errno != 0) || (res == BAD_TIME))
+ break;
+ return res;
+ }
+
+ if (! isdigit ((unsigned char)*pz))
+ break;
+
+ res = parse_non_iso8601 (pz);
+ if ((errno == 0) && (res != BAD_TIME))
+ return res;
+
+ } while (0);
+
+ fprintf (stderr, _("Invalid time duration: %s\n"), pz);
+ if (errno == 0)
+ errno = EINVAL;
+ return BAD_TIME;
+}
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-file-style: "gnu"
+ * indent-tabs-mode: nil
+ * End:
+ * end of parse-duration.c */
--- /dev/null
+/* Parse a time duration and return a seconds count
+ Copyright (C) 2008 Free Software Foundation, Inc.
+ Written by Bruce Korb <bkorb@gnu.org>, 2008.
+
+ 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 <http://www.gnu.org/licenses/>. */
+
+/*
+
+ Readers and users of this function are referred to the ISO-8601
+ specification, with particular attention to "Durations".
+
+ At the time of writing, this worked:
+
+ http://en.wikipedia.org/wiki/ISO_8601#Durations
+
+ The string must start with a 'P', 'T' or a digit.
+
+ ==== if it is a digit
+
+ the string may contain: NNN d NNN h NNN m NNN s
+ This represents NNN days, NNN hours, NNN minutes and NNN seconds.
+ The embeded white space is optional.
+ These terms must appear in this order.
+ The final "s" is optional.
+ All of the terms ("NNN" plus designator) are optional.
+ Minutes and seconds may optionally be represented as NNN:NNN.
+ Also, hours, minute and seconds may be represented as NNN:NNN:NNN.
+ There is no limitation on the value of any of the terms, except
+ that the final result must fit in a time_t value.
+
+ ==== if it is a 'P' or 'T', please see ISO-8601 for a rigorous definition.
+
+ The 'P' term may be followed by any of three formats:
+ yyyymmdd
+ yy-mm-dd
+ yy Y mm M ww W dd D
+
+ or it may be empty and followed by a 'T'. The "yyyymmdd" must be eight
+ digits long. Note: months are always 30 days and years are always 365
+ days long. 5 years is always 1825, not 1826 or 1827 depending on leap
+ year considerations. 3 months is always 90 days. There is no consideration
+ for how many days are in the current, next or previous months.
+
+ For the final format:
+ * Embedded white space is allowed, but it is optional.
+ * All of the terms are optional. Any or all-but-one may be omitted.
+ * The meanings are yy years, mm months, ww weeks and dd days.
+ * The terms must appear in this order.
+
+ ==== The 'T' term may be followed by any of these formats:
+
+ hhmmss
+ hh:mm:ss
+ hh H mm M ss S
+
+ For the final format:
+ * Embedded white space is allowed, but it is optional.
+ * All of the terms are optional. Any or all-but-one may be omitted.
+ * The terms must appear in this order.
+
+ */
+#ifndef GNULIB_PARSE_DURATION_H
+#define GNULIB_PARSE_DURATION_H
+
+#include <time.h>
+
+#define BAD_TIME ((time_t)~0)
+
+extern time_t parse_duration(char const * in_pz);
+
+#endif /* GNULIB_PARSE_DURATION_H */
/*
- * $Id: pgusage.c,v 4.12 2007/04/28 22:19:23 bkorb Exp $
- * Time-stamp: "2006-07-16 08:13:26 bkorb"
+ * $Id: pgusage.c,v 4.17 2009/01/01 16:51:49 bkorb Exp $
+ * Time-stamp: "2008-07-27 21:08:42 bkorb"
*
* Automated Options Paged Usage module.
*
* This routine will run run-on options through a pager so the
* user may examine, print or edit them at their leisure.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
*
- * Automated Options 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.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * These files have the following md5sums:
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
tePagerState pagerState = PAGER_STATE_INITIAL;
optionPagedUsage( tOptions* pOptions, tOptDesc* pOD )
{
#if defined(__windows__) && !defined(__CYGWIN__)
+ if ((pOD->fOptState & OPTST_RESET) != 0)
+ return;
+
(*pOptions->pUsageProc)( pOptions, EXIT_SUCCESS );
#else
static pid_t my_pid;
switch (pagerState) {
case PAGER_STATE_INITIAL:
{
+ if ((pOD->fOptState & OPTST_RESET) != 0)
+ return;
+
my_pid = getpid();
#ifdef HAVE_SNPRINTF
snprintf(zPageUsage, sizeof(zPageUsage), "/tmp/use.%lu", (tAoUL)my_pid);
/* -*- buffer-read-only: t -*- vi: set ro:
*
* Prototypes for autoopts
- * Generated Sat May 5 12:02:36 PDT 2007
+ * Generated Sat May 16 08:15:54 PDT 2009
*/
#ifndef AUTOOPTS_PROTO_H_GUARD
#define AUTOOPTS_PROTO_H_GUARD 1
+
#ifndef LOCAL
# define LOCAL extern
# define REDEF_LOCAL 1
#else
# undef REDEF_LOCAL
#endif
-/*\n * Extracted from autoopts.c\n */
+/*
+ * Extracted from autoopts.c
+ */
LOCAL void *
ao_malloc( size_t sz );
LOCAL tSuccess
doRegularOpts( tOptions* pOpts );
-/*\n * Extracted from configfile.c\n */
+/*
+ * Extracted from configfile.c
+ */
LOCAL void
internalFileLoad( tOptions* pOpts );
LOCAL tSuccess
validateOptionsStruct( tOptions* pOpts, char const* pzProgram );
-/*\n * Extracted from environment.c\n */
+/*
+ * Extracted from environment.c
+ */
LOCAL void
doPrognameEnv( tOptions* pOpts, teEnvPresetType type );
LOCAL void
doEnvPresets( tOptions* pOpts, teEnvPresetType type );
-/*\n * Extracted from load.c\n */
+/*
+ * Extracted from load.c
+ */
LOCAL void
mungeString( char* pzTxt, tOptionLoadMode mode );
tDirection direction,
tOptionLoadMode load_mode );
-/*\n * Extracted from nested.c\n */
+/*
+ * Extracted from nested.c
+ */
LOCAL tOptionValue*
optionLoadNested(char const* pzTxt, char const* pzName, size_t nameLen);
-/*\n * Extracted from sort.c\n */
+LOCAL int
+get_special_char(char const ** ppz, int * ct);
+
+LOCAL void
+emit_special_char(FILE * fp, int ch);
+
+/*
+ * Extracted from sort.c
+ */
LOCAL void
optionSort( tOptions* pOpts );
-/*\n * Extracted from stack.c\n */
+/*
+ * Extracted from stack.c
+ */
LOCAL void
addArgListEntry( void** ppAL, void* entry );
/*
- * $Id: putshell.c,v 4.18 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2007-01-13 10:29:39 bkorb"
+ * $Id: putshell.c,v 4.26 2009/01/01 16:51:49 bkorb Exp $
+ * Time-stamp: "2008-07-27 12:14:38 bkorb"
*
* This module will interpret the options set in the tOptions
* structure and print them to standard out in a fashion that
* will allow them to be interpreted by the Bourne or Korn shells.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
*
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * Automated Options 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.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * These files have the following md5sums:
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
- *
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static void
putQuotedStr( tCC* pzStr );
/* = = = END-STATIC-FORWARD = = = */
printf( zOptNumFmt, pOpts->pzPROGNAME, pOD->pz_NAME,
(int)(uintptr_t)(pOD->optCookie) );
pOD->optCookie = (void*)(uintptr_t)~0UL;
- (*(pOD->pOptProc))( (tOptions*)2UL, pOD );
+ (*(pOD->pOptProc))(OPTPROC_RETURN_VALNAME, pOD);
/*
* We are building the typeset list. The list returned starts with
pz = pOD->optArg.argString + 7;
while (*pz != NUL) {
printf( "typeset -x -i %s_", pOD->pz_NAME );
- pz += strspn( pz, " +\t\n\f" );
+ while (IS_PLUS_N_SPACE_CHAR(*pz)) pz++;
+
for (;;) {
- int ch = *(pz++);
- if (islower( ch )) fputc( toupper( ch ), stdout );
- else if (isalnum( ch )) fputc( ch, stdout );
- else if (isspace( ch )
- || (ch == '+')) goto name_done;
- else if (ch == NUL) { pz--; goto name_done; }
- else fputc( '_', stdout );
+ int ch = *(pz++);
+ if (IS_LOWER_CASE_CHAR(ch)) fputc(toupper(ch), stdout);
+ else if (IS_UPPER_CASE_CHAR(ch)) fputc(ch, stdout);
+ else if (IS_PLUS_N_SPACE_CHAR(ch)) goto name_done;
+ else if (ch == NUL) { pz--; goto name_done; }
+ else fputc( '_', stdout );
} name_done:;
printf( "=%1$lu # 0x%1$lX\n", (unsigned long)val );
val <<= 1;
* to emit the value corresponding to the "optArg" number.
*/
else if (OPTST_GET_ARGTYPE(pOD->fOptState) == OPARG_TYPE_ENUMERATION) {
+ uintptr_t e_val = pOD->optArg.argEnum;
printf( zOptValFmt, pOpts->pzPROGNAME, pOD->pz_NAME );
- fputc( '\'', stdout );
- (*(pOD->pOptProc))( (tOptions*)1UL, pOD );
- fputc( '\'', stdout );
- printf( zOptEnd, pOpts->pzPROGNAME, pOD->pz_NAME );
+
+ /*
+ * Convert value to string, print that and restore numeric value.
+ */
+ (*(pOD->pOptProc))(OPTPROC_RETURN_VALNAME, pOD);
+ printf("'%s'", pOD->optArg.argString);
+ if (pOD->fOptState & OPTST_ALLOC_ARG)
+ AGFREE(pOD->optArg.argString);
+ pOD->optArg.argEnum = e_val;
+
+ printf(zOptEnd, pOpts->pzPROGNAME, pOD->pz_NAME);
}
/*
--- /dev/null
+
+/*
+ * $Id: reset.c,v 4.3 2009/01/01 16:51:49 bkorb Exp $
+ * Time-stamp: "2008-08-02 12:25:18 bkorb"
+ *
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
+ *
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
+ *
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
+ *
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
+ *
+ * These files have the following md5sums:
+ *
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
+ */
+
+static void
+optionReset( tOptions* pOpts, tOptDesc* pOD )
+{
+ pOD->fOptState &= OPTST_PERSISTENT_MASK;
+ pOD->fOptState |= OPTST_RESET;
+ if (pOD->pOptProc != NULL)
+ pOD->pOptProc(pOpts, pOD);
+ pOD->optArg.argString =
+ pOpts->originalOptArgArray[ pOD->optIndex ].argString;
+ pOD->optCookie = pOpts->originalOptArgCookie[ pOD->optIndex ];
+ pOD->fOptState &= OPTST_PERSISTENT_MASK;
+}
+
+
+static void
+optionResetEverything(tOptions * pOpts)
+{
+ tOptDesc * pOD = pOpts->pOptDesc;
+ int ct = pOpts->presetOptCt;
+
+ for (;;) {
+ optionReset(pOpts, pOD);
+
+ if (--ct <= 0)
+ break;
+ pOD++;
+ }
+}
+
+
+/*=export_func optionResetOpt
+ * private:
+ *
+ * what: Reset the value of an option
+ * arg: + tOptions* + pOpts + program options descriptor +
+ * arg: + tOptDesc* + pOptDesc + the descriptor for this arg +
+ *
+ * doc:
+ * This code will cause another option to be reset to its initial state.
+ * For example, --reset=foo will cause the --foo option to be reset.
+=*/
+void
+optionResetOpt( tOptions* pOpts, tOptDesc* pOD )
+{
+ static ag_bool reset_active = AG_FALSE;
+
+ tOptState opt_state = OPTSTATE_INITIALIZER(DEFINED);
+ char const * pzArg = pOD->optArg.argString;
+ tSuccess succ;
+
+ if (reset_active)
+ return;
+
+ if ( (! HAS_originalOptArgArray(pOpts))
+ || (pOpts->originalOptArgCookie == NULL)) {
+ fputs(zResetNotConfig, stderr);
+ _exit(EX_SOFTWARE);
+ }
+
+ if ((pzArg == NULL) || (*pzArg == NUL)) {
+ fputs(zNoResetArg, stderr);
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ }
+
+ reset_active = AG_TRUE;
+
+ if (pzArg[1] == NUL) {
+ if (*pzArg == '*') {
+ optionResetEverything(pOpts);
+ reset_active = AG_FALSE;
+ return;
+ }
+
+ succ = shortOptionFind(pOpts, (tAoUC)*pzArg, &opt_state);
+ if (! SUCCESSFUL(succ)) {
+ fprintf(stderr, zIllOptChr, pOpts->pzProgPath, *pzArg);
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ }
+ } else {
+ succ = longOptionFind(pOpts, (char *)pzArg, &opt_state);
+ if (! SUCCESSFUL(succ)) {
+ fprintf(stderr, zIllOptStr, pOpts->pzProgPath, pzArg);
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ }
+ }
+
+ /*
+ * We've found the indicated option. Turn off all non-persistent
+ * flags because we're forcing the option back to its initialized state.
+ * Call any callout procedure to handle whatever it needs to.
+ * Finally, clear the reset flag, too.
+ */
+ optionReset(pOpts, opt_state.pOD);
+ reset_active = AG_FALSE;
+}
+/*
+ * Local Variables:
+ * mode: C
+ * c-file-style: "stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * end of autoopts/reset.c */
/*
- * restore.c $Id: restore.c,v 4.10 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2007-01-13 14:13:17 bkorb"
+ * restore.c $Id: restore.c,v 4.14 2009/01/01 16:51:49 bkorb Exp $
+ * Time-stamp: "2007-07-04 11:34:40 bkorb"
*
* This module's routines will save the current option state to memory
* and restore it. If saved prior to the initial optionProcess call,
* then the initial state will be restored.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
- *
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
- *
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
- *
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ *
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
+ *
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
+ *
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
+ *
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
+ *
+ * These files have the following md5sums:
+ *
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
/*
/*
- * save.c $Id: save.c,v 4.18 2007/04/15 19:01:18 bkorb Exp $
- * Time-stamp: "2007-04-15 11:11:10 bkorb"
+ * save.c $Id: save.c,v 4.29 2009/01/01 16:51:49 bkorb Exp $
+ * Time-stamp: "2008-09-23 14:24:58 bkorb"
*
* This module's routines will take the currently set options and
* store them into an ".rc" file for re-interpretation the next
* time the invoking program is run.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
*
- * Automated Options 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.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * These files have the following md5sums:
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
-tSCC zWarn[] = "%s WARNING: cannot save options - ";
+static char const zWarn[] = "%s WARNING: cannot save options - ";
+static char const close_xml[] = "</%s>\n";
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static tCC*
findDirName( tOptions* pOpts, int* p_free );
FILE * fp,
tOptDesc * p,
tCC* pzLA );
+
+static void
+print_a_value(FILE * fp, int depth, tOptDesc * pOD, tOptionValue const * ovp);
+
+static void
+print_a_string(FILE * fp, char const * name, char const * pz);
+
+static void
+printValueList(FILE * fp, char const * name, tArgList * al);
+
+static void
+printHierarchy(FILE * fp, tOptDesc * p);
+
+static FILE *
+openSaveFile( tOptions* pOpts );
+
+static void
+printNoArgOpt(FILE * fp, tOptDesc * p, tOptDesc * pOD);
+
+static void
+printStringArg(FILE * fp, tOptDesc * pOD);
+
+static void
+printEnumArg(FILE * fp, tOptDesc * pOD);
+
+static void
+printSetMemberArg(FILE * fp, tOptDesc * pOD);
+
+static void
+printFileArg(FILE * fp, tOptDesc * pOD, tOptions* pOpts);
/* = = = END-STATIC-FORWARD = = = */
static tCC*
}
-/*=export_func optionSaveFile
- *
- * what: saves the option state to a file
- *
- * arg: tOptions*, pOpts, program options descriptor
- *
- * doc:
- *
- * This routine will save the state of option processing to a file. The name
- * of that file can be specified with the argument to the @code{--save-opts}
- * option, or by appending the @code{rcfile} attribute to the last
- * @code{homerc} attribute. If no @code{rcfile} attribute was specified, it
- * will default to @code{.@i{programname}rc}. If you wish to specify another
- * file, you should invoke the @code{SET_OPT_SAVE_OPTS( @i{filename} )} macro.
- *
- * err:
- *
- * If no @code{homerc} file was specified, this routine will silently return
- * and do nothing. If the output file cannot be created or updated, a message
- * will be printed to @code{stderr} and the routine will return.
-=*/
-void
-optionSaveFile( tOptions* pOpts )
+static void
+print_a_value(FILE * fp, int depth, tOptDesc * pOD, tOptionValue const * ovp)
+{
+ static char const bool_atr[] = "<%1$s type=boolean>%2$s</%1$s>\n";
+ static char const numb_atr[] = "<%1$s type=integer>0x%2$lX</%1$s>\n";
+ static char const type_atr[] = "<%s type=%s>";
+ static char const null_atr[] = "<%s/>\n";
+
+ while (--depth >= 0)
+ putc(' ', fp), putc(' ', fp);
+
+ switch (ovp->valType) {
+ default:
+ case OPARG_TYPE_NONE:
+ fprintf(fp, null_atr, ovp->pzName);
+ break;
+
+ case OPARG_TYPE_STRING:
+ print_a_string(fp, ovp->pzName, ovp->v.strVal);
+ break;
+
+ case OPARG_TYPE_ENUMERATION:
+ case OPARG_TYPE_MEMBERSHIP:
+ if (pOD != NULL) {
+ tAoUI opt_state = pOD->fOptState;
+ uintptr_t val = pOD->optArg.argEnum;
+ char const * typ = (ovp->valType == OPARG_TYPE_ENUMERATION)
+ ? "keyword" : "set-membership";
+
+ fprintf(fp, type_atr, ovp->pzName, typ);
+
+ /*
+ * This is a magic incantation that will convert the
+ * bit flag values back into a string suitable for printing.
+ */
+ (*(pOD->pOptProc))(OPTPROC_RETURN_VALNAME, pOD );
+ if (pOD->optArg.argString != NULL) {
+ fputs(pOD->optArg.argString, fp);
+
+ if (ovp->valType != OPARG_TYPE_ENUMERATION) {
+ /*
+ * set membership strings get allocated
+ */
+ AGFREE( (void*)pOD->optArg.argString );
+ }
+ }
+
+ pOD->optArg.argEnum = val;
+ pOD->fOptState = opt_state;
+ fprintf(fp, close_xml, ovp->pzName);
+ break;
+ }
+ /* FALLTHROUGH */
+
+ case OPARG_TYPE_NUMERIC:
+ fprintf(fp, numb_atr, ovp->pzName, ovp->v.longVal);
+ break;
+
+ case OPARG_TYPE_BOOLEAN:
+ fprintf(fp, bool_atr, ovp->pzName,
+ ovp->v.boolVal ? "true" : "false");
+ break;
+
+ case OPARG_TYPE_HIERARCHY:
+ printValueList(fp, ovp->pzName, ovp->v.nestVal);
+ break;
+ }
+}
+
+
+static void
+print_a_string(FILE * fp, char const * name, char const * pz)
+{
+ static char const open_atr[] = "<%s>";
+
+ fprintf(fp, open_atr, name);
+ for (;;) {
+ int ch = ((int)*(pz++)) & 0xFF;
+
+ switch (ch) {
+ case NUL: goto string_done;
+
+ case '&':
+ case '<':
+ case '>':
+#if __GNUC__ >= 4
+ case 1 ... (' ' - 1):
+ case ('~' + 1) ... 0xFF:
+#endif
+ emit_special_char(fp, ch);
+ break;
+
+ default:
+#if __GNUC__ < 4
+ if ( ((ch >= 1) && (ch <= (' ' - 1)))
+ || ((ch >= ('~' + 1)) && (ch <= 0xFF)) ) {
+ emit_special_char(fp, ch);
+ break;
+ }
+#endif
+ putc(ch, fp);
+ }
+ } string_done:;
+ fprintf(fp, close_xml, name);
+}
+
+
+static void
+printValueList(FILE * fp, char const * name, tArgList * al)
+{
+ static int depth = 1;
+
+ int sp_ct;
+ int opt_ct;
+ void ** opt_list;
+
+ if (al == NULL)
+ return;
+ opt_ct = al->useCt;
+ opt_list = (void **)al->apzArgs;
+
+ if (opt_ct <= 0) {
+ fprintf(fp, "<%s/>\n", name);
+ return;
+ }
+
+ fprintf(fp, "<%s type=nested>\n", name);
+
+ depth++;
+ while (--opt_ct >= 0) {
+ tOptionValue const * ovp = *(opt_list++);
+
+ print_a_value(fp, depth, NULL, ovp);
+ }
+ depth--;
+
+ for (sp_ct = depth; --sp_ct >= 0;)
+ putc(' ', fp), putc(' ', fp);
+ fprintf(fp, "</%s>\n", name);
+}
+
+
+static void
+printHierarchy(FILE * fp, tOptDesc * p)
+{
+ int opt_ct;
+ tArgList * al = p->optCookie;
+ void ** opt_list;
+
+ if (al == NULL)
+ return;
+
+ opt_ct = al->useCt;
+ opt_list = (void **)al->apzArgs;
+
+ if (opt_ct <= 0)
+ return;
+
+ do {
+ tOptionValue const * base = *(opt_list++);
+ tOptionValue const * ovp = optionGetValue(base, NULL);
+
+ if (ovp == NULL)
+ continue;
+
+ fprintf(fp, "<%s type=nested>\n", p->pz_Name);
+
+ do {
+ print_a_value(fp, 1, p, ovp);
+
+ } while (ovp = optionNextValue(base, ovp),
+ ovp != NULL);
+
+ fprintf(fp, "</%s>\n", p->pz_Name);
+ } while (--opt_ct > 0);
+}
+
+
+static FILE *
+openSaveFile( tOptions* pOpts )
{
- tOptDesc* pOD;
- int ct;
FILE* fp;
{
int free_name = 0;
tCC* pzFName = findFileName( pOpts, &free_name );
if (pzFName == NULL)
- return;
+ return NULL;
fp = fopen( pzFName, "w" FOPEN_BINARY_FLAG );
if (fp == NULL) {
fprintf( stderr, zNoCreat, errno, strerror( errno ), pzFName );
if (free_name)
AGFREE((void*) pzFName );
- return;
+ return fp;
}
if (free_name)
#endif
}
+ return fp;
+}
+
+static void
+printNoArgOpt(FILE * fp, tOptDesc * p, tOptDesc * pOD)
+{
+ /*
+ * The aliased to argument indicates whether or not the option
+ * is "disabled". However, the original option has the name
+ * string, so we get that there, not with "p".
+ */
+ char const * pznm =
+ (DISABLED_OPT( p )) ? pOD->pz_DisableName : pOD->pz_Name;
+ /*
+ * If the option was disabled and the disablement name is NULL,
+ * then the disablement was caused by aliasing.
+ * Use the name as the string to emit.
+ */
+ if (pznm == NULL)
+ pznm = pOD->pz_Name;
+
+ fprintf(fp, "%s\n", pznm);
+}
+
+static void
+printStringArg(FILE * fp, tOptDesc * pOD)
+{
+ if (pOD->fOptState & OPTST_STACKED) {
+ tArgList* pAL = (tArgList*)pOD->optCookie;
+ int uct = pAL->useCt;
+ tCC** ppz = pAL->apzArgs;
+
+ /*
+ * un-disable multiple copies of disabled options.
+ */
+ if (uct > 1)
+ pOD->fOptState &= ~OPTST_DISABLED;
+
+ while (uct-- > 0)
+ printEntry( fp, pOD, *(ppz++) );
+ } else {
+ printEntry( fp, pOD, pOD->optArg.argString );
+ }
+}
+
+static void
+printEnumArg(FILE * fp, tOptDesc * pOD)
+{
+ uintptr_t val = pOD->optArg.argEnum;
+
+ /*
+ * This is a magic incantation that will convert the
+ * bit flag values back into a string suitable for printing.
+ */
+ (*(pOD->pOptProc))(OPTPROC_RETURN_VALNAME, pOD);
+ printEntry( fp, pOD, (void*)(pOD->optArg.argString));
+
+ pOD->optArg.argEnum = val;
+}
+
+static void
+printSetMemberArg(FILE * fp, tOptDesc * pOD)
+{
+ uintptr_t val = pOD->optArg.argEnum;
+
+ /*
+ * This is a magic incantation that will convert the
+ * bit flag values back into a string suitable for printing.
+ */
+ (*(pOD->pOptProc))(OPTPROC_RETURN_VALNAME, pOD);
+ printEntry( fp, pOD, (void*)(pOD->optArg.argString));
+
+ if (pOD->optArg.argString != NULL) {
+ /*
+ * set membership strings get allocated
+ */
+ AGFREE( (void*)pOD->optArg.argString );
+ pOD->fOptState &= ~OPTST_ALLOC_ARG;
+ }
+
+ pOD->optArg.argEnum = val;
+}
+
+static void
+printFileArg(FILE * fp, tOptDesc * pOD, tOptions* pOpts)
+{
+ /*
+ * If the cookie is not NULL, then it has the file name, period.
+ * Otherwise, if we have a non-NULL string argument, then....
+ */
+ if (pOD->optCookie != NULL)
+ printEntry(fp, pOD, pOD->optCookie);
+
+ else if (HAS_originalOptArgArray(pOpts)) {
+ char const * orig =
+ pOpts->originalOptArgArray[pOD->optIndex].argString;
+
+ if (pOD->optArg.argString == orig)
+ return;
+
+ printEntry(fp, pOD, pOD->optArg.argString);
+ }
+}
+
+
+/*=export_func optionSaveFile
+ *
+ * what: saves the option state to a file
+ *
+ * arg: tOptions*, pOpts, program options descriptor
+ *
+ * doc:
+ *
+ * This routine will save the state of option processing to a file. The name
+ * of that file can be specified with the argument to the @code{--save-opts}
+ * option, or by appending the @code{rcfile} attribute to the last
+ * @code{homerc} attribute. If no @code{rcfile} attribute was specified, it
+ * will default to @code{.@i{programname}rc}. If you wish to specify another
+ * file, you should invoke the @code{SET_OPT_SAVE_OPTS( @i{filename} )} macro.
+ *
+ * The recommend usage is as follows:
+ * @example
+ * optionProcess(&progOptions, argc, argv);
+ * if (i_want_a_non_standard_place_for_this)
+ * SET_OPT_SAVE_OPTS("myfilename");
+ * optionSaveFile(&progOptions);
+ * @end example
+ *
+ * err:
+ *
+ * If no @code{homerc} file was specified, this routine will silently return
+ * and do nothing. If the output file cannot be created or updated, a message
+ * will be printed to @code{stderr} and the routine will return.
+=*/
+void
+optionSaveFile( tOptions* pOpts )
+{
+ tOptDesc* pOD;
+ int ct;
+ FILE* fp = openSaveFile(pOpts);
+
+ if (fp == NULL)
+ return;
+
/*
* FOR each of the defined options, ...
*/
ct = pOpts->presetOptCt;
pOD = pOpts->pOptDesc;
do {
- int arg_state;
tOptDesc* p;
/*
* OR it does not take an initialization value
* OR it is equivalenced to another option
* THEN continue (ignore it)
+ *
+ * Equivalenced options get picked up when the equivalenced-to
+ * option is processed.
*/
if (UNUSED_OPT( pOD ))
continue;
- if ((pOD->fOptState & (OPTST_NO_INIT|OPTST_DOCUMENT|OPTST_OMITTED))
- != 0)
+ if ((pOD->fOptState & OPTST_DO_NOT_SAVE_MASK) != 0)
continue;
if ( (pOD->optEquivIndex != NO_EQUIVALENT)
- && (pOD->optEquivIndex != pOD->optIndex))
+ && (pOD->optEquivIndex != pOD->optIndex))
continue;
/*
- * Set a temporary pointer to the real option description
- * (i.e. account for equivalencing)
+ * The option argument data are found at the equivalenced-to option,
+ * but the actual option argument type comes from the original
+ * option descriptor. Be careful!
*/
p = ((pOD->fOptState & OPTST_EQUIVALENCE) != 0)
? (pOpts->pOptDesc + pOD->optActualIndex) : pOD;
- /*
- * IF no arguments are allowed
- * THEN just print the name and continue
- */
- if (OPTST_GET_ARGTYPE(pOD->fOptState) == OPARG_TYPE_NONE) {
- char const * pznm =
- (DISABLED_OPT( p )) ? p->pz_DisableName : p->pz_Name;
- /*
- * If the option was disabled and the disablement name is NULL,
- * then the disablement was caused by aliasing.
- * Use the name as the string to emit.
- */
- if (pznm == NULL)
- pznm = p->pz_Name;
-
- fprintf(fp, "%s\n", pznm);
- continue;
- }
+ switch (OPTST_GET_ARGTYPE(pOD->fOptState)) {
+ case OPARG_TYPE_NONE:
+ printNoArgOpt(fp, p, pOD);
+ break;
- arg_state = OPTST_GET_ARGTYPE(p->fOptState);
- switch (arg_state) {
- case 0:
case OPARG_TYPE_NUMERIC:
printEntry( fp, p, (void*)(p->optArg.argInt));
break;
case OPARG_TYPE_STRING:
- if (p->fOptState & OPTST_STACKED) {
- tArgList* pAL = (tArgList*)p->optCookie;
- int uct = pAL->useCt;
- tCC** ppz = pAL->apzArgs;
-
- /*
- * Disallow multiple copies of disabled options.
- */
- if (uct > 1)
- p->fOptState &= ~OPTST_DISABLED;
-
- while (uct-- > 0)
- printEntry( fp, p, *(ppz++) );
- } else {
- printEntry( fp, p, p->optArg.argString );
- }
+ printStringArg(fp, p);
break;
case OPARG_TYPE_ENUMERATION:
- case OPARG_TYPE_MEMBERSHIP:
- {
- uintptr_t val = p->optArg.argEnum;
- /*
- * This is a magic incantation that will convert the
- * bit flag values back into a string suitable for printing.
- */
- (*(p->pOptProc))( (tOptions*)2UL, p );
- printEntry( fp, p, (void*)(p->optArg.argString));
-
- if ( (p->optArg.argString != NULL)
- && (arg_state != OPARG_TYPE_ENUMERATION)) {
- /*
- * set membership strings get allocated
- */
- AGFREE( (void*)p->optArg.argString );
- p->fOptState &= ~OPTST_ALLOC_ARG;
- }
+ printEnumArg(fp, p);
+ break;
- p->optArg.argEnum = val;
+ case OPARG_TYPE_MEMBERSHIP:
+ printSetMemberArg(fp, p);
break;
- }
case OPARG_TYPE_BOOLEAN:
printEntry( fp, p, p->optArg.argBool ? "true" : "false" );
break;
+ case OPARG_TYPE_HIERARCHY:
+ printHierarchy(fp, p);
+ break;
+
+ case OPARG_TYPE_FILE:
+ printFileArg(fp, p, pOpts);
+ break;
+
default:
break; /* cannot handle - skip it */
}
/*
- * sort.c $Id: sort.c,v 4.10 2007/04/28 22:19:23 bkorb Exp $
- * Time-stamp: "2006-10-18 11:29:04 bkorb"
+ * sort.c $Id: sort.c,v 4.15 2009/01/01 16:51:49 bkorb Exp $
+ * Time-stamp: "2007-07-04 11:34:52 bkorb"
*
* This module implements argument sorting.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
+ * These files have the following md5sums:
*
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static tSuccess
mustHandleArg( tOptions* pOpts, char* pzArg, tOptState* pOS,
char** ppzOpts, int* pOptsIdx );
/*
* stack.c
- * $Id: stack.c,v 4.13 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2007-01-13 10:43:21 bkorb"
+ * $Id: stack.c,v 4.18 2009/01/01 16:51:49 bkorb Exp $
+ * Time-stamp: "2008-07-30 16:56:32 bkorb"
*
* This is a special option processing routine that will save the
* argument to an option in a FIFO queue.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
*
- * Automated Options 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.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * These files have the following md5sums:
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
#ifdef WITH_LIBREGEX
{
int res;
- tArgList* pAL = (tArgList*)pOptDesc->optCookie;
+ tArgList* pAL;
+
+ if ((pOptDesc->fOptState & OPTST_RESET) != 0)
+ return;
+ pAL = (tArgList*)pOptDesc->optCookie;
+
/*
* IF we don't have any stacked options,
* THEN indicate that we don't have any of these options
{
char * pz;
- if (pOD->optArg.argString == NULL)
- return;
+ if ((pOD->fOptState & OPTST_RESET) != 0) {
+ tArgList* pAL = (void*)pOD->optCookie;
+ int ix;
+ if (pAL == NULL)
+ return;
+
+ ix = pAL->useCt;
+ while (--ix >= 0)
+ AGFREE(pAL->apzArgs[ix]);
+ AGFREE(pAL);
- AGDUPSTR(pz, pOD->optArg.argString, "stack arg");
- addArgListEntry( &(pOD->optCookie), (void*)pz );
+ } else {
+ if (pOD->optArg.argString == NULL)
+ return;
+
+ AGDUPSTR(pz, pOD->optArg.argString, "stack arg");
+ addArgListEntry( &(pOD->optCookie), (void*)pz );
+ }
}
/*
* Local Variables:
/*
- * $Id: streqvcmp.c,v 4.10 2007/04/28 22:19:23 bkorb Exp $
- * Time-stamp: "2006-07-26 18:25:53 bkorb"
+ * $Id: streqvcmp.c,v 4.15 2009/01/01 16:51:49 bkorb Exp $
+ * Time-stamp: "2008-12-26 10:15:46 bkorb"
*
* String Equivalence Comparison
*
* character before comparison. In processing long option names,
* the characters "-", "_" and "^" all need to be equivalent
* (because they are treated so by different development environments).
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
- *
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
- *
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
- *
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
- */
-
-/*
+ *
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
+ *
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
+ *
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
+ *
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
+ *
+ * These files have the following md5sums:
+ *
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
+ *
* This array is designed for mapping upper and lower case letter
* together for a case independent comparison. The mappings are
* based upon ascii character sequences.
* This function name is mapped to option_strtransform so as to not conflict
* with the POSIX name space.
*
+ * The source and destination may be the same.
+ *
* err: none.
=*/
void
/*
- * $Id: text_mmap.c,v 4.15 2006/11/27 01:52:23 bkorb Exp $
+ * $Id: text_mmap.c,v 4.19 2009/01/01 16:51:49 bkorb Exp $
*
- * Time-stamp: "2006-09-10 14:50:04 bkorb"
+ * Time-stamp: "2007-07-04 11:35:49 bkorb"
+ *
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
+ *
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
+ *
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
+ *
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
+ *
+ * These files have the following md5sums:
+ *
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
#ifndef MAP_ANONYMOUS
--- /dev/null
+
+/*
+ * $Id: time.c,v 4.3 2009/01/01 16:51:50 bkorb Exp $
+ * Time-stamp: "2008-11-16 14:51:48 bkorb"
+ *
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
+ *
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
+ *
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
+ *
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
+ *
+ * These files have the following md5sums:
+ *
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
+ */
+
+#ifndef HAVE_PARSE_DURATION
+#include <time.h>
+
+static inline char *
+ao_xstrdup(char const * pz)
+{
+ char * str;
+ AGDUPSTR(str, pz, "time val str");
+ return str;
+}
+
+#define xstrdup(_s) ao_xstrdup(_s)
+
+#include "parse-duration.c"
+
+#undef xstrdup
+#endif
+
+/*=export_func optionTimeVal
+ * private:
+ *
+ * what: process an option with a time value.
+ * arg: + tOptions* + pOpts + program options descriptor +
+ * arg: + tOptDesc* + pOptDesc + the descriptor for this arg +
+ *
+ * doc:
+ * Decipher a time duration value.
+=*/
+void
+optionTimeVal(tOptions* pOpts, tOptDesc* pOD )
+{
+ long val;
+
+ if ((pOD->fOptState & OPTST_RESET) != 0)
+ return;
+
+ val = parse_duration(pOD->optArg.argString);
+ if (errno != 0)
+ goto bad_time;
+
+ if (pOD->fOptState & OPTST_ALLOC_ARG) {
+ AGFREE(pOD->optArg.argString);
+ pOD->fOptState &= ~OPTST_ALLOC_ARG;
+ }
+
+ pOD->optArg.argInt = val;
+ return;
+
+bad_time:
+ fprintf( stderr, zNotNumber, pOpts->pzProgName, pOD->optArg.argString );
+ if ((pOpts->fOptSet & OPTPROC_ERRSTOP) != 0)
+ (*(pOpts->pUsageProc))(pOpts, EXIT_FAILURE);
+
+ pOD->optArg.argInt = ~0;
+}
+/*
+ * Local Variables:
+ * mode: C
+ * c-file-style: "stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * end of autoopts/numeric.c */
/*
* This file defines the string_tokenize interface
- * Time-stamp: "2006-06-24 15:27:49 bkorb"
+ * Time-stamp: "2007-11-12 20:40:36 bkorb"
*
- * string_tokenize copyright 2005 Bruce Korb
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * string_tokenize is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * string_tokenize 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
- * Lesser General Public License for more details.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with string_tokenize; if not, write to:
- * The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
+ *
+ * These files have the following md5sums:
+ *
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
-#include <ctype.h>
+
#include <errno.h>
#include <stdlib.h>
#define ch_t unsigned char
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static void
copy_cooked( ch_t** ppDest, char const ** ppSrc );
* Trim leading white space. Use "ENOENT" and a NULL return to indicate
* an empty string was passed.
*/
- while (isspace( (ch_t)*str )) str++;
+ while (IS_WHITESPACE_CHAR(*str)) str++;
if (*str == NUL) {
bogus_str:
errno = ENOENT;
do {
max_token_ct++;
- while (! isspace( *++pz ))
+ while (! IS_WHITESPACE_CHAR(*++pz))
if (*pz == NUL) goto found_nul;
- while (isspace( *pz )) pz++;
+ while (IS_WHITESPACE_CHAR(*pz)) pz++;
} while (*pz != NUL);
found_nul:
res->tkn_list[ res->tkn_ct++ ] = pzDest;
for (;;) {
int ch = (ch_t)*str;
- if (isspace( ch )) {
+ if (IS_WHITESPACE_CHAR(ch)) {
found_white_space:
- while (isspace( (ch_t)*++str )) ;
+ while (IS_WHITESPACE_CHAR(*++str)) ;
break;
}
errno = EINVAL;
return NULL;
}
- if (isspace( (ch_t)*str ))
+ if (IS_WHITESPACE_CHAR(*str))
goto found_white_space;
break;
errno = EINVAL;
return NULL;
}
- if (isspace( (ch_t)*str ))
+ if (IS_WHITESPACE_CHAR(*str))
goto found_white_space;
break;
/*
- * usage.c $Id: usage.c,v 4.15 2007/04/28 22:19:23 bkorb Exp $
- * Time-stamp: "2007-04-15 11:02:46 bkorb"
+ * usage.c $Id: usage.c,v 4.30 2009/01/17 22:08:07 bkorb Exp $
+ * Time-stamp: "2009-01-17 13:18:23 bkorb"
*
* This module implements the default usage procedure for
* Automated Options. It may be overridden, of course.
*/
/*
- * Automated Options copyright 1992-2007 Bruce Korb
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * Automated Options 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.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * These files have the following md5sums:
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
- *
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
- *
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
#define OPTPROC_L_N_S (OPTPROC_LONGOPT | OPTPROC_SHORTOPT)
static ag_bool displayEnum;
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static ag_bool
checkGNUUsage( tOptions* pOpts );
* Paged usage will preset option_usage_fp to an output file.
* If it hasn't already been set, then set it to standard output
* on successful exit (help was requested), otherwise error out.
+ *
+ * Test the version before obtaining pzFullUsage or pzShortUsage.
+ * These fields do not exist before revision 30.
*/
- if (option_usage_fp == NULL)
- option_usage_fp = (actual_exit_code != EXIT_SUCCESS) ? stderr : stdout;
+ {
+ char const * pz;
+
+ if (actual_exit_code == EXIT_SUCCESS) {
+ pz = (pOptions->structVersion >= 30 * 4096)
+ ? pOptions->pzFullUsage : NULL;
+
+ if (option_usage_fp == NULL)
+ option_usage_fp = stdout;
+ } else {
+ pz = (pOptions->structVersion >= 30 * 4096)
+ ? pOptions->pzShortUsage : NULL;
+
+ if (option_usage_fp == NULL)
+ option_usage_fp = stderr;
+ }
+
+ if (pz != NULL) {
+ fputs(pz, option_usage_fp);
+ exit(actual_exit_code);
+ }
+ }
fprintf( option_usage_fp, pOptions->pzUsageTitle, pOptions->pzProgName );
fprintf( option_usage_fp, zDis, pOD->pz_DisableName );
/*
- * IF the numeric option has a special callback,
- * THEN call it, requesting the range or other special info
+ * Check for argument types that have callbacks with magical properties
*/
- if ( (OPTST_GET_ARGTYPE(pOD->fOptState) == OPARG_TYPE_NUMERIC)
- && (pOD->pOptProc != NULL)
- && (pOD->pOptProc != optionNumericVal) ) {
- (*(pOD->pOptProc))( pOptions, NULL );
+ switch (OPTST_GET_ARGTYPE(pOD->fOptState)) {
+ case OPARG_TYPE_NUMERIC:
+ /*
+ * IF the numeric option has a special callback,
+ * THEN call it, requesting the range or other special info
+ */
+ if ( (pOD->pOptProc != NULL)
+ && (pOD->pOptProc != optionNumericVal) ) {
+ (*(pOD->pOptProc))(OPTPROC_EMIT_USAGE, pOD);
+ }
+ break;
+
+ case OPARG_TYPE_FILE:
+ (*(pOD->pOptProc))(OPTPROC_EMIT_USAGE, pOD);
+ break;
}
/*
*/
if ((pOptions->fOptSet & OPTPROC_SHORTOPT) == 0)
fputs( pAT->pzSpc, option_usage_fp );
- else if (! isgraph( pOD->optValue)) {
+ else if (! IS_GRAPHIC_CHAR(pOD->optValue)) {
if ( (pOptions->fOptSet & (OPTPROC_GNUUSAGE|OPTPROC_LONGOPT))
== (OPTPROC_GNUUSAGE|OPTPROC_LONGOPT))
fputc( ' ', option_usage_fp );
* when the option argument is required, base the type string on the
* argument type.
*/
- if (OPTST_GET_ARGTYPE(pOD->fOptState) == OPARG_TYPE_NONE) {
- pzArgType = pAT->pzNo;
-
- } else if (pOD->fOptState & OPTST_ARG_OPTIONAL) {
+ if (pOD->fOptState & OPTST_ARG_OPTIONAL) {
pzArgType = pAT->pzOpt;
} else switch (OPTST_GET_ARGTYPE(pOD->fOptState)) {
+ case OPARG_TYPE_NONE: pzArgType = pAT->pzNo; break;
case OPARG_TYPE_ENUMERATION: pzArgType = pAT->pzKey; break;
+ case OPARG_TYPE_FILE : pzArgType = pAT->pzFile; break;
case OPARG_TYPE_MEMBERSHIP: pzArgType = pAT->pzKeyL; break;
case OPARG_TYPE_BOOLEAN: pzArgType = pAT->pzBool; break;
case OPARG_TYPE_NUMERIC: pzArgType = pAT->pzNum; break;
case OPARG_TYPE_HIERARCHY: pzArgType = pAT->pzNest; break;
case OPARG_TYPE_STRING: pzArgType = pAT->pzStr; break;
- default: goto bogus_desc; break;
+ case OPARG_TYPE_TIME: pzArgType = pAT->pzTime; break;
+ default: goto bogus_desc;
}
snprintf( z, sizeof(z), pAT->pzOptFmt, pzArgType, pOD->pz_Name,
int docCt = 0;
do {
- if ((pOD->fOptState & OPTST_OMITTED) != 0)
+ if ((pOD->fOptState & OPTST_NO_USAGE_MASK) != 0)
continue;
if ((pOD->fOptState & OPTST_DOCUMENT) != 0) {
* THEN document that the remaining options are not user opts
*/
if ( (pOpts->presetOptCt == optNo)
- && (ex_code == EXIT_SUCCESS)
- && (docCt > 0)
- && ((pOD[-1].fOptState & OPTST_DOCUMENT) == 0) )
+ && (ex_code == EXIT_SUCCESS)
+ && (docCt > 0)
+ && ((pOD[-1].fOptState & OPTST_DOCUMENT) == 0) )
fprintf( option_usage_fp, argTypes.pzBrk, zAuto, pOptTitle );
printOneUsage( pOpts, pOD, &argTypes );
switch (OPTST_GET_ARGTYPE(pOD->fOptState)) {
case OPARG_TYPE_ENUMERATION:
case OPARG_TYPE_MEMBERSHIP:
- (*(pOD->pOptProc))( NULL, pOD );
+ (*(pOD->pOptProc))(OPTPROC_EMIT_USAGE, pOD);
}
} while (pOD++, optNo++, (--ct > 0));
}
argTypes.pzNum = zGnuNumArg;
argTypes.pzKey = zGnuKeyArg;
argTypes.pzKeyL = zGnuKeyLArg;
+ argTypes.pzTime = zGnuTimeArg;
+ argTypes.pzFile = zGnuFileArg;
argTypes.pzBool = zGnuBoolArg;
argTypes.pzNest = zGnuNestArg;
argTypes.pzOpt = zGnuOptArg;
argTypes.pzNum = zStdNumArg;
argTypes.pzKey = zStdKeyArg;
argTypes.pzKeyL = zStdKeyLArg;
+ argTypes.pzTime = zStdTimeArg;
+ argTypes.pzFile = zStdFileArg;
argTypes.pzBool = zStdBoolArg;
argTypes.pzNest = zStdNestArg;
argTypes.pzOpt = zStdOptArg;
--- /dev/null
+/* ANSI-C code produced by gperf version 3.0.3 */
+
+
+#if 0 /* gperf build options: */
+// %struct-type
+// %language=ANSI-C
+// %includes
+// %global-table
+// %omit-struct-type
+// %readonly-tables
+// %compare-strncmp
+//
+// %define slot-name vtp_name
+// %define hash-function-name value_type_hash
+// %define lookup-function-name find_value_type_name
+// %define word-array-name value_type_table
+// %define initializer-suffix ,VTP_COUNT_KWD
+#endif /* gperf build options: */
+
+#include "value-type.h"
+
+typedef struct {
+ char const * vtp_name;
+ value_type_enum_t vtp_id;
+} value_type_map_t;
+#include <string.h>
+
+/* maximum key range = 20, duplicates = 0 */
+
+#ifdef __GNUC__
+#else
+#ifdef __cplusplus
+#endif
+#endif
+inline static unsigned int
+value_type_hash (register const char *str, register unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 10, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 5, 23, 23, 5, 0, 0, 23, 15, 23,
+ 23, 10, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23
+ };
+ return len + asso_values[(unsigned char)str[2]];
+}
+
+static const value_type_map_t value_type_table[] =
+ {
+ {"",VTP_COUNT_KWD}, {"",VTP_COUNT_KWD},
+ {"",VTP_COUNT_KWD},
+ {"set", VTP_KWD_SET},
+ {"",VTP_COUNT_KWD}, {"",VTP_COUNT_KWD},
+ {"nested", VTP_KWD_NESTED},
+ {"integer", VTP_KWD_INTEGER},
+ {"",VTP_COUNT_KWD},
+ {"bool", VTP_KWD_BOOL},
+ {"",VTP_COUNT_KWD},
+ {"string", VTP_KWD_STRING},
+ {"boolean", VTP_KWD_BOOLEAN},
+ {"",VTP_COUNT_KWD},
+ {"set-membership", VTP_KWD_SET_MEMBERSHIP},
+ {"",VTP_COUNT_KWD}, {"",VTP_COUNT_KWD},
+ {"keyword", VTP_KWD_KEYWORD},
+ {"",VTP_COUNT_KWD},
+ {"hierarchy", VTP_KWD_HIERARCHY},
+ {"",VTP_COUNT_KWD}, {"",VTP_COUNT_KWD},
+ {"invalid", VTP_KWD_INVALID}
+ };
+
+#ifdef __GNUC__
+#ifdef __GNUC_STDC_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+static inline const value_type_map_t *
+find_value_type_name (register const char *str, register unsigned int len)
+{
+ if (len <= 14 && len >= 3)
+ {
+ register int key = value_type_hash (str, len);
+
+ if (key <= 22 && key >= 0)
+ {
+ register const char *s = value_type_table[key].vtp_name;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0')
+ return &value_type_table[key];
+ }
+ }
+ return 0;
+}
+
+
+value_type_enum_t
+find_value_type_id(char const * str, unsigned int len)
+{
+ const value_type_map_t * p =
+ find_value_type_name(str, len);
+ return (p == 0) ? VTP_KWD_INVALID : p->vtp_id;
+}
--- /dev/null
+/*
+ * Generated header for gperf generated source Sat May 16 08:16:06 PDT 2009
+ * This file enumerates the list of names and declares the
+ * procedure for mapping string names to the enum value.
+ */
+#ifndef AUTOOPTS_VALUE_TYPE_H_GUARD
+#define AUTOOPTS_VALUE_TYPE_H_GUARD 1
+
+typedef enum {
+ VTP_KWD_INVALID,
+ VTP_KWD_STRING,
+ VTP_KWD_INTEGER,
+ VTP_KWD_BOOLEAN,
+ VTP_KWD_BOOL,
+ VTP_KWD_KEYWORD,
+ VTP_KWD_SET,
+ VTP_KWD_SET_MEMBERSHIP,
+ VTP_KWD_NESTED,
+ VTP_KWD_HIERARCHY,
+ VTP_COUNT_KWD
+} value_type_enum_t;
+
+extern value_type_enum_t
+find_value_type_id(char const * str, unsigned int len);
+#endif /* AUTOOPTS_VALUE_TYPE_H_GUARD */
-/* $Id: version.c,v 4.10 2007/04/28 22:19:23 bkorb Exp $
- * Time-stamp: "2007-04-28 10:08:34 bkorb"
+/* $Id: version.c,v 4.16 2009/01/01 16:51:50 bkorb Exp $
+ * Time-stamp: "2008-07-27 10:11:30 bkorb"
*
* This module implements the default usage procedure for
* Automated Options. It may be overridden, of course.
*/
-static char const zAOV[] =
- "Automated Options version %s, copyright (c) 1999-2007 Bruce Korb\n";
-
-/* Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+/*
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
+ * These files have the following md5sums:
*
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static void
printVersion( tOptions* pOpts, tOptDesc* pOD, FILE* fp );
/* = = = END-STATIC-FORWARD = = = */
fputs( pOpts->pzCopyright, fp );
fputc( '\n', fp );
}
- fprintf( fp, zAOV, optionVersion() );
+ fprintf( fp, zAO_Ver, optionVersion() );
if (pOpts->pzBugAddr != NULL)
fprintf( fp, zPlsSendBugs, pOpts->pzBugAddr );
break;
fputc( '\n', fp );
}
- fprintf( fp, zAOV, optionVersion() );
+ fprintf( fp, zAO_Ver, optionVersion() );
if (pOpts->pzBugAddr != NULL)
fprintf( fp, zPlsSendBugs, pOpts->pzBugAddr );
break;
--- /dev/null
+/* ANSI-C code produced by gperf version 3.0.3 */
+
+
+#if 0 /* gperf build options: */
+// %struct-type
+// %language=ANSI-C
+// %includes
+// %global-table
+// %omit-struct-type
+// %readonly-tables
+// %compare-strncmp
+//
+// %define slot-name xat_name
+// %define hash-function-name xat_attribute_hash
+// %define lookup-function-name find_xat_attribute_name
+// %define word-array-name xat_attribute_table
+// %define initializer-suffix ,XAT_COUNT_KWD
+#endif /* gperf build options: */
+
+#include "xat-attribute.h"
+
+typedef struct {
+ char const * xat_name;
+ xat_attribute_enum_t xat_id;
+} xat_attribute_map_t;
+#include <string.h>
+
+/* maximum key range = 9, duplicates = 0 */
+
+#ifdef __GNUC__
+#else
+#ifdef __cplusplus
+#endif
+#endif
+inline static unsigned int
+xat_attribute_hash (register const char *str, register unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 0,
+ 13, 13, 13, 13, 13, 5, 13, 5, 13, 0,
+ 13, 13, 13, 13, 13, 13, 0, 0, 13, 0,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13
+ };
+ return len + asso_values[(unsigned char)str[0]];
+}
+
+static const xat_attribute_map_t xat_attribute_table[] =
+ {
+ {"",XAT_COUNT_KWD}, {"",XAT_COUNT_KWD},
+ {"",XAT_COUNT_KWD}, {"",XAT_COUNT_KWD},
+ {"type", XAT_KWD_TYPE},
+ {"words", XAT_KWD_WORDS},
+ {"cooked", XAT_KWD_COOKED},
+ {"members", XAT_KWD_MEMBERS},
+ {"uncooked", XAT_KWD_UNCOOKED},
+ {"keep", XAT_KWD_KEEP},
+ {"",XAT_COUNT_KWD}, {"",XAT_COUNT_KWD},
+ {"invalid", XAT_KWD_INVALID}
+ };
+
+#ifdef __GNUC__
+#ifdef __GNUC_STDC_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+static inline const xat_attribute_map_t *
+find_xat_attribute_name (register const char *str, register unsigned int len)
+{
+ if (len <= 8 && len >= 4)
+ {
+ register int key = xat_attribute_hash (str, len);
+
+ if (key <= 12 && key >= 0)
+ {
+ register const char *s = xat_attribute_table[key].xat_name;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0')
+ return &xat_attribute_table[key];
+ }
+ }
+ return 0;
+}
+
+
+xat_attribute_enum_t
+find_xat_attribute_id(char const * str, unsigned int len)
+{
+ const xat_attribute_map_t * p =
+ find_xat_attribute_name(str, len);
+ return (p == 0) ? XAT_KWD_INVALID : p->xat_id;
+}
--- /dev/null
+/*
+ * Generated header for gperf generated source Sat May 16 08:16:06 PDT 2009
+ * This file enumerates the list of names and declares the
+ * procedure for mapping string names to the enum value.
+ */
+#ifndef AUTOOPTS_XAT_ATTRIBUTE_H_GUARD
+#define AUTOOPTS_XAT_ATTRIBUTE_H_GUARD 1
+
+typedef enum {
+ XAT_KWD_INVALID,
+ XAT_KWD_TYPE,
+ XAT_KWD_WORDS,
+ XAT_KWD_MEMBERS,
+ XAT_KWD_COOKED,
+ XAT_KWD_UNCOOKED,
+ XAT_KWD_KEEP,
+ XAT_COUNT_KWD
+} xat_attribute_enum_t;
+
+extern xat_attribute_enum_t
+find_xat_attribute_id(char const * str, unsigned int len);
+#endif /* AUTOOPTS_XAT_ATTRIBUTE_H_GUARD */
--- /dev/null
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ copyright (c) 2009 by Bruce Korb - all rights reserved
+ 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) by Bruce Korb - all rights reserved
+
+ 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 <http://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) by Bruce Korb - all rights reserved
+ 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
+<http://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
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+++ /dev/null
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-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 this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-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
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser 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 Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "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
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY 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
-LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey 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 library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
--- /dev/null
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ copyright (c) 2009 by Bruce Korb - all rights reserved
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser 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
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
endif
libopts_la_SOURCES = libopts.c
libopts_la_CPPFLAGS = -I$(top_srcdir)
-libopts_la_LDFLAGS = -version-info 29:0:4
+libopts_la_LDFLAGS = -version-info 32:1:7
EXTRA_DIST = \
- COPYING.lgpl COPYING.mbsd MakeDefs.inc \
- README autoopts/options.h autoopts/usage-txt.h \
- autoopts.c autoopts.h boolean.c \
- compat/windows-config.h compat/compat.h compat/pathfind.c \
- compat/snprintf.c compat/strdup.c compat/strchr.c \
- configfile.c cook.c enumeration.c \
- environment.c genshell.c genshell.h \
+ COPYING.gplv3 COPYING.lgplv3 COPYING.mbsd \
+ MakeDefs.inc README ag-char-map.h \
+ autoopts/options.h autoopts/usage-txt.h autoopts.c \
+ autoopts.h boolean.c compat/windows-config.h \
+ compat/compat.h compat/pathfind.c compat/snprintf.c \
+ compat/strdup.c compat/strchr.c configfile.c \
+ cook.c enumeration.c environment.c \
+ file.c genshell.c genshell.h \
load.c m4/libopts.m4 m4/liboptschk.m4 \
makeshell.c nested.c numeric.c \
- pgusage.c proto.h putshell.c \
+ parse-duration.c parse-duration.h pgusage.c \
+ proto.h putshell.c reset.c \
restore.c save.c sort.c \
stack.c streqvcmp.c text_mmap.c \
- tokenize.c usage.c version.c
+ time.c tokenize.c usage.c \
+ value-type.c value-type.h version.c \
+ xat-attribute.c xat-attribute.h
--- /dev/null
+/*
+ * Character mapping generated 05/16/09 08:16:06
+ *
+ * This file contains the character classifications
+ * used by AutoGen and AutoOpts for identifying tokens.
+ */
+#ifndef AG_CHAR_MAP_H_GUARD
+#define AG_CHAR_MAP_H_GUARD 1
+
+#ifdef HAVE_CONFIG_H
+# if defined(HAVE_INTTYPES_H)
+# include <inttypes.h>
+# elif defined(HAVE_STDINT_H)
+# include <stdint.h>
+# else
+# error "no int-types header."
+# choke-me-now.
+# endif
+#else
+# ifdef __sun
+# include <inttypes.h>
+# else
+# include <stdint.h>
+# endif
+#endif
+
+#if 0 /* mapping specification source (from autogen.map) */
+//
+// %guard autoopts_internal
+// %file ag-char-map.h
+// %table opt-char-cat
+//
+// %comment
+// This file contains the character classifications
+// used by AutoGen and AutoOpts for identifying tokens.
+// %
+//
+// lower-case "a-z"
+// upper-case "A-Z"
+// alphabetic +lower-case +upper-case
+// oct-digit "0-7"
+// dec-digit "89" +oct-digit
+// hex-digit "a-fA-F" +dec-digit
+// alphanumeric +alphabetic +dec-digit
+// var-first "_" +alphabetic
+// variable-name +var-first +dec-digit
+// option-name "^-" +variable-name
+// value-name ":" +option-name
+// horiz-white "\t "
+// compound-name "[.]" +value-name +horiz-white
+// whitespace "\v\f\r\n\b" +horiz-white
+// unquotable "!-~" -"\"#(),;<=>[\\]`{}?*'"
+// end-xml-token "/>" +whitespace
+// graphic "!-~"
+// plus-n-space "+" +whitespace
+// punctuation "!-~" -alphanumeric -"_"
+// suffix "-._" +alphanumeric
+// suffix-fmt "%/" +suffix
+// false-type "nNfF0\x00"
+//
+#endif /* 0 -- mapping spec. source */
+
+typedef uint32_t opt_char_cat_mask_t;
+extern opt_char_cat_mask_t const opt_char_cat[128];
+
+static inline int is_opt_char_cat_char(char ch, opt_char_cat_mask_t mask) {
+ unsigned int ix = (unsigned char)ch;
+ return ((ix < 0x7F) && ((opt_char_cat[ix] & mask) != 0)); }
+
+#define IS_LOWER_CASE_CHAR(_c) is_opt_char_cat_char((_c), 0x00001)
+#define IS_UPPER_CASE_CHAR(_c) is_opt_char_cat_char((_c), 0x00002)
+#define IS_ALPHABETIC_CHAR(_c) is_opt_char_cat_char((_c), 0x00003)
+#define IS_OCT_DIGIT_CHAR(_c) is_opt_char_cat_char((_c), 0x00004)
+#define IS_DEC_DIGIT_CHAR(_c) is_opt_char_cat_char((_c), 0x0000C)
+#define IS_HEX_DIGIT_CHAR(_c) is_opt_char_cat_char((_c), 0x0001C)
+#define IS_ALPHANUMERIC_CHAR(_c) is_opt_char_cat_char((_c), 0x0000F)
+#define IS_VAR_FIRST_CHAR(_c) is_opt_char_cat_char((_c), 0x00023)
+#define IS_VARIABLE_NAME_CHAR(_c) is_opt_char_cat_char((_c), 0x0002F)
+#define IS_OPTION_NAME_CHAR(_c) is_opt_char_cat_char((_c), 0x0006F)
+#define IS_VALUE_NAME_CHAR(_c) is_opt_char_cat_char((_c), 0x000EF)
+#define IS_HORIZ_WHITE_CHAR(_c) is_opt_char_cat_char((_c), 0x00100)
+#define IS_COMPOUND_NAME_CHAR(_c) is_opt_char_cat_char((_c), 0x003EF)
+#define IS_WHITESPACE_CHAR(_c) is_opt_char_cat_char((_c), 0x00500)
+#define IS_UNQUOTABLE_CHAR(_c) is_opt_char_cat_char((_c), 0x00800)
+#define IS_END_XML_TOKEN_CHAR(_c) is_opt_char_cat_char((_c), 0x01500)
+#define IS_GRAPHIC_CHAR(_c) is_opt_char_cat_char((_c), 0x02000)
+#define IS_PLUS_N_SPACE_CHAR(_c) is_opt_char_cat_char((_c), 0x04500)
+#define IS_PUNCTUATION_CHAR(_c) is_opt_char_cat_char((_c), 0x08000)
+#define IS_SUFFIX_CHAR(_c) is_opt_char_cat_char((_c), 0x1000F)
+#define IS_SUFFIX_FMT_CHAR(_c) is_opt_char_cat_char((_c), 0x3000F)
+#define IS_FALSE_TYPE_CHAR(_c) is_opt_char_cat_char((_c), 0x40000)
+
+#ifdef AUTOOPTS_INTERNAL
+opt_char_cat_mask_t const opt_char_cat[128] = {
+ /*x00*/ 0x40000, /*x01*/ 0x00000, /*x02*/ 0x00000, /*x03*/ 0x00000,
+ /*x04*/ 0x00000, /*x05*/ 0x00000, /*x06*/ 0x00000, /*\a */ 0x00000,
+ /*\b */ 0x00400, /*\t */ 0x00100, /*\n */ 0x00400, /*\v */ 0x00400,
+ /*\f */ 0x00400, /*\r */ 0x00400, /*x0E*/ 0x00000, /*x0F*/ 0x00000,
+ /*x10*/ 0x00000, /*x11*/ 0x00000, /*x12*/ 0x00000, /*x13*/ 0x00000,
+ /*x14*/ 0x00000, /*x15*/ 0x00000, /*x16*/ 0x00000, /*x17*/ 0x00000,
+ /*x18*/ 0x00000, /*x19*/ 0x00000, /*x1A*/ 0x00000, /*x1B*/ 0x00000,
+ /*x1C*/ 0x00000, /*x1D*/ 0x00000, /*x1E*/ 0x00000, /*x1F*/ 0x00000,
+ /* */ 0x00100, /* ! */ 0x0A800, /* " */ 0x0A000, /* # */ 0x0A000,
+ /* $ */ 0x0A800, /* % */ 0x2A800, /* & */ 0x0A800, /* ' */ 0x0A000,
+ /* ( */ 0x0A000, /* ) */ 0x0A000, /* * */ 0x0A000, /* + */ 0x0E800,
+ /* , */ 0x0A000, /* - */ 0x1A840, /* . */ 0x1AA00, /* / */ 0x2B800,
+ /* 0 */ 0x42804, /* 1 */ 0x02804, /* 2 */ 0x02804, /* 3 */ 0x02804,
+ /* 4 */ 0x02804, /* 5 */ 0x02804, /* 6 */ 0x02804, /* 7 */ 0x02804,
+ /* 8 */ 0x02808, /* 9 */ 0x02808, /* : */ 0x0A880, /* ; */ 0x0A000,
+ /* < */ 0x0A000, /* = */ 0x0A000, /* > */ 0x0B000, /* ? */ 0x0A000,
+ /* @ */ 0x0A800, /* A */ 0x02812, /* B */ 0x02812, /* C */ 0x02812,
+ /* D */ 0x02812, /* E */ 0x02812, /* F */ 0x42812, /* G */ 0x02802,
+ /* H */ 0x02802, /* I */ 0x02802, /* J */ 0x02802, /* K */ 0x02802,
+ /* L */ 0x02802, /* M */ 0x02802, /* N */ 0x42802, /* O */ 0x02802,
+ /* P */ 0x02802, /* Q */ 0x02802, /* R */ 0x02802, /* S */ 0x02802,
+ /* T */ 0x02802, /* U */ 0x02802, /* V */ 0x02802, /* W */ 0x02802,
+ /* X */ 0x02802, /* Y */ 0x02802, /* Z */ 0x02802, /* [ */ 0x0A200,
+ /* \ */ 0x0A000, /* ] */ 0x0A200, /* ^ */ 0x0A840, /* _ */ 0x12820,
+ /* ` */ 0x0A000, /* a */ 0x02811, /* b */ 0x02811, /* c */ 0x02811,
+ /* d */ 0x02811, /* e */ 0x02811, /* f */ 0x42811, /* g */ 0x02801,
+ /* h */ 0x02801, /* i */ 0x02801, /* j */ 0x02801, /* k */ 0x02801,
+ /* l */ 0x02801, /* m */ 0x02801, /* n */ 0x42801, /* o */ 0x02801,
+ /* p */ 0x02801, /* q */ 0x02801, /* r */ 0x02801, /* s */ 0x02801,
+ /* t */ 0x02801, /* u */ 0x02801, /* v */ 0x02801, /* w */ 0x02801,
+ /* x */ 0x02801, /* y */ 0x02801, /* z */ 0x02801, /* { */ 0x0A000,
+ /* | */ 0x0A800, /* } */ 0x0A000, /* ~ */ 0x0A800, /*x7F*/ 0x00000
+};
+#endif /* AUTOOPTS_INTERNAL */
+#endif /* AG_CHAR_MAP_H_GUARD */
/*
- * $Id: autoopts.c,v 4.25 2007/04/15 19:01:18 bkorb Exp $
- * Time-stamp: "2007-04-15 11:10:40 bkorb"
+ * $Id: autoopts.c,v 4.39 2009/01/25 19:31:59 bkorb Exp $
+ * Time-stamp: "2009-01-12 02:49:49 bkorb"
*
* This file contains all of the routines that must be linked into
* an executable to use the generated option processing. The optional
* routines are in separately compiled modules so that they will not
* necessarily be linked in.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
+ * These files have the following md5sums:
*
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
static char const zNil[] = "";
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static tSuccess
findOptDesc( tOptions* pOpts, tOptState* pOptState );
static tSuccess
-nextOption( tOptions* pOpts, tOptState* pOptState );
+next_opt_arg_must(tOptions* pOpts, tOptState* pOptState);
+
+static tSuccess
+next_opt_arg_may(tOptions* pOpts, tOptState* pOptState);
+
+static tSuccess
+next_opt_arg_none(tOptions* pOpts, tOptState* pOptState);
+
+static tSuccess
+nextOption(tOptions* pOpts, tOptState* pOptState);
static tSuccess
doPresets( tOptions* pOpts );
{
char * res = strdup(str);
if (res == NULL) {
- fprintf( stderr, "strdup of %d byte string failed\n", (int)strlen(str) );
+ fprintf(stderr, "strdup of %d byte string failed\n", (int)strlen(str));
exit( EXIT_FAILURE );
}
return res;
int matchCt = 0;
int matchIdx = 0;
int nameLen;
+ char opt_name_buf[128];
/*
* IF the value is attached to the name,
- * THEN clip it off.
- * Either way, figure out how long our name is
+ * copy it off so we can NUL terminate.
*/
if (pzEq != NULL) {
nameLen = (int)(pzEq - pzOptName);
- *pzEq = NUL;
+ if (nameLen >= sizeof(opt_name_buf))
+ return FAILURE;
+ memcpy(opt_name_buf, pzOptName, nameLen);
+ opt_name_buf[nameLen] = NUL;
+ pzOptName = opt_name_buf;
+ pzEq++;
+
} else nameLen = strlen( pzOptName );
do {
} while (pOD++, (++idx < idxLim));
- if (pzEq != NULL)
- *(pzEq++) = '=';
-
/*
* Make sure we either found an exact match or found only one partial
*/
* THEN call the usage procedure.
*/
if ((pOpts->fOptSet & OPTPROC_ERRSTOP) != 0) {
- fprintf( stderr, zIllOptStr, pOpts->pzProgPath,
- (matchCt == 0) ? zIllegal : zAmbiguous, pzOptName );
+ fprintf(stderr, (matchCt == 0) ? zIllOptStr : zAmbigOptStr,
+ pOpts->pzProgPath, pzOptName);
(*pOpts->pUsageProc)( pOpts, EXIT_FAILURE );
}
* THEN the result is the "option" itself and the
* option is the specially marked "number" option.
*/
- if ( isdigit( optValue )
+ if ( IS_DEC_DIGIT_CHAR(optValue)
&& (pOpts->specOptIdx.number_option != NO_EQUIVALENT) ) {
pOptState->pOD = \
pRes = pOpts->pOptDesc + pOpts->specOptIdx.number_option;
* IF all arguments must be named options, ...
*/
if (NAMED_OPTS(pOpts)) {
- char* pz = pOpts->pzCurOpt;
+ char * pz = pOpts->pzCurOpt;
+ int def;
+ tSuccess res;
+ tAoUS * def_opt;
+
pOpts->curOptIdx++;
+ if (*pz != '-')
+ return longOptionFind(pOpts, pz, pOptState);
+
/*
- * Skip over any flag/option markers.
- * In this mode, they are not required.
+ * The name is prefixed with one or more hyphens. Strip them off
+ * and disable the "default_opt" setting. Use heavy recasting to
+ * strip off the "const" quality of the "default_opt" field.
*/
- while (*pz == '-') pz++;
-
- return longOptionFind( pOpts, pz, pOptState );
+ while (*(++pz) == '-') ;
+ def_opt = (void *)&(pOpts->specOptIdx.default_opt);
+ def = *def_opt;
+ *def_opt = NO_EQUIVALENT;
+ res = longOptionFind(pOpts, pz, pOptState);
+ *def_opt = def;
+ return res;
}
/*
}
-/*
- * nextOption
- *
- * Find the option descriptor and option argument (if any) for the
- * next command line argument. DO NOT modify the descriptor. Put
- * all the state in the state argument so that the option can be skipped
- * without consequence (side effect).
- */
static tSuccess
-nextOption( tOptions* pOpts, tOptState* pOptState )
+next_opt_arg_must(tOptions* pOpts, tOptState* pOptState)
{
- tSuccess res;
- enum { ARG_NONE, ARG_MAY, ARG_MUST } arg_type = ARG_NONE;
- teOptArgType at;
-
- res = findOptDesc( pOpts, pOptState );
- if (! SUCCESSFUL( res ))
- return res;
- pOptState->flags |= (pOptState->pOD->fOptState & OPTST_PERSISTENT_MASK);
- at = OPTST_GET_ARGTYPE(pOptState->flags);
-
/*
- * Figure out what to do about option arguments. An argument may be
- * required, not associated with the option, or be optional. We detect the
- * latter by examining for an option marker on the next possible argument.
- * Disabled mode option selection also disables option arguments.
+ * An option argument is required. Long options can either have
+ * a separate command line argument, or an argument attached by
+ * the '=' character. Figure out which.
*/
- if ((pOptState->flags & OPTST_DISABLED) != 0)
- arg_type = ARG_NONE;
- else if (at == OPARG_TYPE_NONE)
- arg_type = ARG_NONE;
- else if (pOptState->flags & OPTST_ARG_OPTIONAL)
- arg_type = ARG_MAY;
- else
- arg_type = ARG_MUST;
-
- switch (arg_type) {
- case ARG_MUST:
+ switch (pOptState->optType) {
+ case TOPT_SHORT:
/*
- * An option argument is required. Long options can either have
- * a separate command line argument, or an argument attached by
- * the '=' character. Figure out which.
+ * See if an arg string follows the flag character
*/
- switch (pOptState->optType) {
- case TOPT_SHORT:
- /*
- * See if an arg string follows the flag character
- */
- if (*++(pOpts->pzCurOpt) == NUL)
- pOpts->pzCurOpt = pOpts->origArgVect[ pOpts->curOptIdx++ ];
- pOptState->pzOptArg = pOpts->pzCurOpt;
- break;
+ if (*++(pOpts->pzCurOpt) == NUL)
+ pOpts->pzCurOpt = pOpts->origArgVect[ pOpts->curOptIdx++ ];
+ pOptState->pzOptArg = pOpts->pzCurOpt;
+ break;
- case TOPT_LONG:
- /*
- * See if an arg string has already been assigned (glued on
- * with an `=' character)
- */
- if (pOptState->pzOptArg == NULL)
- pOptState->pzOptArg = pOpts->origArgVect[ pOpts->curOptIdx++ ];
- break;
+ case TOPT_LONG:
+ /*
+ * See if an arg string has already been assigned (glued on
+ * with an `=' character)
+ */
+ if (pOptState->pzOptArg == NULL)
+ pOptState->pzOptArg = pOpts->origArgVect[ pOpts->curOptIdx++ ];
+ break;
- default:
+ default:
#ifdef DEBUG
- fputs( "AutoOpts lib error: option type not selected\n",
- stderr );
- exit( EXIT_FAILURE );
+ fputs( "AutoOpts lib error: option type not selected\n",
+ stderr );
+ exit( EXIT_FAILURE );
#endif
- case TOPT_DEFAULT:
- /*
- * The option was selected by default. The current token is
- * the option argument.
- */
- break;
- }
-
+ case TOPT_DEFAULT:
/*
- * Make sure we did not overflow the argument list.
+ * The option was selected by default. The current token is
+ * the option argument.
*/
- if (pOpts->curOptIdx > pOpts->origArgCt) {
- fprintf( stderr, zMisArg, pOpts->pzProgPath,
- pOptState->pOD->pz_Name );
- return FAILURE;
- }
-
- pOpts->pzCurOpt = NULL; /* next time advance to next arg */
break;
+ }
- case ARG_MAY:
- /*
- * An option argument is optional.
- */
- switch (pOptState->optType) {
- case TOPT_SHORT:
- if (*++pOpts->pzCurOpt != NUL)
- pOptState->pzOptArg = pOpts->pzCurOpt;
- else {
- char* pzLA = pOpts->origArgVect[ pOpts->curOptIdx ];
-
- /*
- * BECAUSE it is optional, we must make sure
- * we did not find another flag and that there
- * is such an argument.
- */
- if ((pzLA == NULL) || (*pzLA == '-'))
- pOptState->pzOptArg = NULL;
- else {
- pOpts->curOptIdx++; /* argument found */
- pOptState->pzOptArg = pzLA;
- }
- }
- break;
+ /*
+ * Make sure we did not overflow the argument list.
+ */
+ if (pOpts->curOptIdx > pOpts->origArgCt) {
+ fprintf( stderr, zMisArg, pOpts->pzProgPath,
+ pOptState->pOD->pz_Name );
+ return FAILURE;
+ }
+
+ pOpts->pzCurOpt = NULL; /* next time advance to next arg */
+ return SUCCESS;
+}
+
+
+static tSuccess
+next_opt_arg_may(tOptions* pOpts, tOptState* pOptState)
+{
+ /*
+ * An option argument is optional.
+ */
+ switch (pOptState->optType) {
+ case TOPT_SHORT:
+ if (*++pOpts->pzCurOpt != NUL)
+ pOptState->pzOptArg = pOpts->pzCurOpt;
+ else {
+ char* pzLA = pOpts->origArgVect[ pOpts->curOptIdx ];
- case TOPT_LONG:
/*
- * Look for an argument if we don't already have one (glued on
- * with a `=' character) *AND* we are not in named argument mode
+ * BECAUSE it is optional, we must make sure
+ * we did not find another flag and that there
+ * is such an argument.
*/
- if ( (pOptState->pzOptArg == NULL)
- && (! NAMED_OPTS(pOpts))) {
- char* pzLA = pOpts->origArgVect[ pOpts->curOptIdx ];
-
- /*
- * BECAUSE it is optional, we must make sure
- * we did not find another flag and that there
- * is such an argument.
- */
- if ((pzLA == NULL) || (*pzLA == '-'))
- pOptState->pzOptArg = NULL;
- else {
- pOpts->curOptIdx++; /* argument found */
- pOptState->pzOptArg = pzLA;
- }
+ if ((pzLA == NULL) || (*pzLA == '-'))
+ pOptState->pzOptArg = NULL;
+ else {
+ pOpts->curOptIdx++; /* argument found */
+ pOptState->pzOptArg = pzLA;
}
- break;
-
- default:
- case TOPT_DEFAULT:
- fputs( "AutoOpts lib error: defaulted to option with optional arg\n",
- stderr );
- exit( EX_SOFTWARE );
}
-
- /*
- * After an option with an optional argument, we will
- * *always* start with the next option because if there
- * were any characters following the option name/flag,
- * they would be interpreted as the argument.
- */
- pOpts->pzCurOpt = NULL;
break;
- default: /* CANNOT */
+ case TOPT_LONG:
/*
- * No option argument. Make sure next time around we find
- * the correct option flag character for short options
+ * Look for an argument if we don't already have one (glued on
+ * with a `=' character) *AND* we are not in named argument mode
*/
- if (pOptState->optType == TOPT_SHORT)
- (pOpts->pzCurOpt)++;
+ if ( (pOptState->pzOptArg == NULL)
+ && (! NAMED_OPTS(pOpts))) {
+ char* pzLA = pOpts->origArgVect[ pOpts->curOptIdx ];
- /*
- * It is a long option. Make sure there was no ``=xxx'' argument
- */
- else if (pOptState->pzOptArg != NULL) {
- fprintf( stderr, zNoArg, pOpts->pzProgPath,
- pOptState->pOD->pz_Name );
- return FAILURE;
+ /*
+ * BECAUSE it is optional, we must make sure
+ * we did not find another flag and that there
+ * is such an argument.
+ */
+ if ((pzLA == NULL) || (*pzLA == '-'))
+ pOptState->pzOptArg = NULL;
+ else {
+ pOpts->curOptIdx++; /* argument found */
+ pOptState->pzOptArg = pzLA;
+ }
}
+ break;
- /*
- * It is a long option. Advance to next command line argument.
- */
- else
- pOpts->pzCurOpt = NULL;
+ default:
+ case TOPT_DEFAULT:
+ fputs(zAO_Woops, stderr );
+ exit( EX_SOFTWARE );
}
+ /*
+ * After an option with an optional argument, we will
+ * *always* start with the next option because if there
+ * were any characters following the option name/flag,
+ * they would be interpreted as the argument.
+ */
+ pOpts->pzCurOpt = NULL;
return SUCCESS;
}
+static tSuccess
+next_opt_arg_none(tOptions* pOpts, tOptState* pOptState)
+{
+ /*
+ * No option argument. Make sure next time around we find
+ * the correct option flag character for short options
+ */
+ if (pOptState->optType == TOPT_SHORT)
+ (pOpts->pzCurOpt)++;
+
+ /*
+ * It is a long option. Make sure there was no ``=xxx'' argument
+ */
+ else if (pOptState->pzOptArg != NULL) {
+ fprintf(stderr, zNoArg, pOpts->pzProgPath, pOptState->pOD->pz_Name);
+ return FAILURE;
+ }
+
+ /*
+ * It is a long option. Advance to next command line argument.
+ */
+ else
+ pOpts->pzCurOpt = NULL;
+ return SUCCESS;
+}
+
+/*
+ * nextOption
+ *
+ * Find the option descriptor and option argument (if any) for the
+ * next command line argument. DO NOT modify the descriptor. Put
+ * all the state in the state argument so that the option can be skipped
+ * without consequence (side effect).
+ */
+static tSuccess
+nextOption(tOptions* pOpts, tOptState* pOptState)
+{
+ {
+ tSuccess res;
+ res = findOptDesc( pOpts, pOptState );
+ if (! SUCCESSFUL( res ))
+ return res;
+ }
+
+ if ( ((pOptState->flags & OPTST_DEFINED) != 0)
+ && ((pOptState->pOD->fOptState & OPTST_NO_COMMAND) != 0)) {
+ fprintf(stderr, zNotCmdOpt, pOptState->pOD->pz_Name);
+ return FAILURE;
+ }
+
+ pOptState->flags |= (pOptState->pOD->fOptState & OPTST_PERSISTENT_MASK);
+
+ /*
+ * Figure out what to do about option arguments. An argument may be
+ * required, not associated with the option, or be optional. We detect the
+ * latter by examining for an option marker on the next possible argument.
+ * Disabled mode option selection also disables option arguments.
+ */
+ {
+ enum { ARG_NONE, ARG_MAY, ARG_MUST } arg_type = ARG_NONE;
+ tSuccess res;
+
+ if ((pOptState->flags & OPTST_DISABLED) != 0)
+ arg_type = ARG_NONE;
+
+ else if (OPTST_GET_ARGTYPE(pOptState->flags) == OPARG_TYPE_NONE)
+ arg_type = ARG_NONE;
+
+ else if (pOptState->flags & OPTST_ARG_OPTIONAL)
+ arg_type = ARG_MAY;
+
+ else
+ arg_type = ARG_MUST;
+
+ switch (arg_type) {
+ case ARG_MUST: res = next_opt_arg_must(pOpts, pOptState); break;
+ case ARG_MAY: res = next_opt_arg_may( pOpts, pOptState); break;
+ case ARG_NONE: res = next_opt_arg_none(pOpts, pOptState); break;
+ }
+
+ return res;
+ }
+}
+
+
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* DO PRESETS
* has a --load-opts option. See if a command line option has disabled
* option presetting.
*/
- if (pOpts->specOptIdx.save_opts != 0) {
+ if ( (pOpts->specOptIdx.save_opts != NO_EQUIVALENT)
+ && (pOpts->specOptIdx.save_opts != 0)) {
pOD = pOpts->pOptDesc + pOpts->specOptIdx.save_opts + 1;
if (DISABLED_OPT(pOD))
return SUCCESS;
if (! SUCCESSFUL( doPresets( pOpts )))
return 0;
+ /*
+ * IF option name conversion was suppressed but it is not suppressed
+ * for the command line, then it's time to translate option names.
+ * Usage text will not get retranslated.
+ */
+ if ( ((pOpts->fOptSet & OPTPROC_TRANSLATE) != 0)
+ && (pOpts->pTransProc != NULL)
+ && ((pOpts->fOptSet & OPTPROC_NO_XLAT_MASK)
+ == OPTPROC_NXLAT_OPT_CFG) ) {
+
+ pOpts->fOptSet &= ~OPTPROC_NXLAT_OPT_CFG;
+ (*pOpts->pTransProc)();
+ }
+
if ((pOpts->fOptSet & OPTPROC_REORDER) != 0)
optionSort( pOpts );
* THEN do that now before testing for conflicts.
* (conflicts are ignored in preset options)
*/
- if (pOpts->specOptIdx.save_opts != 0) {
+ if ( (pOpts->specOptIdx.save_opts != NO_EQUIVALENT)
+ && (pOpts->specOptIdx.save_opts != 0)) {
tOptDesc* pOD = pOpts->pOptDesc + pOpts->specOptIdx.save_opts;
if (SELECTED_OPT( pOD )) {
/*
- * Time-stamp: "2007-04-15 09:59:39 bkorb"
+ * Time-stamp: "2008-11-01 20:08:06 bkorb"
*
- * autoopts.h $Id: autoopts.h,v 4.23 2007/04/15 19:01:18 bkorb Exp $
- * Time-stamp: "2005-02-14 05:59:50 bkorb"
+ * autoopts.h $Id: autoopts.h,v 4.30 2009/01/01 16:51:47 bkorb Exp $
*
* This file defines all the global structures and special values
* used in the automated option processing library.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
*
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * Automated Options 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.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * These files have the following md5sums:
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
- *
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
#ifndef AUTOGEN_AUTOOPTS_H
#define AUTOGEN_AUTOOPTS_H
#include "compat/compat.h"
+#include "ag-char-map.h"
#define AO_NAME_LIMIT 127
#define AO_NAME_SIZE ((size_t)(AO_NAME_LIMIT + 1))
#define PROCESSING(d) ((d)>0)
#define PRESETTING(d) ((d)<0)
-#define ISNAMECHAR( c ) (isalnum(c) || ((c) == '_') || ((c) == '-'))
-
/*
* Procedure success codes
*
tCC* pzStr;
tCC* pzReq;
tCC* pzNum;
+ tCC* pzFile;
tCC* pzKey;
tCC* pzKeyL;
tCC* pzBool;
tCC* pzNoF;
tCC* pzSpc;
tCC* pzOptFmt;
+ tCC* pzTime;
} arg_types_t;
#define AGALOC( c, w ) ao_malloc((size_t)c)
#define AGREALOC( p, c, w ) ao_realloc((void*)p, (size_t)c)
-#define AGFREE( p ) ao_free((void*)p)
+#define AGFREE(_p) do{void*X=(void*)_p;ao_free(X);}while(0)
#define AGDUPSTR( p, s, w ) (p = ao_strdup(s))
static void *
*
* DO NOT EDIT THIS FILE (options.h)
*
- * It has been AutoGen-ed Saturday May 5, 2007 at 12:02:34 PM PDT
+ * It has been AutoGen-ed Saturday May 16, 2009 at 08:15:53 AM PDT
* From the definitions funcs.def
* and the template file options_h
*
*
* Automated Options copyright 1992-Y Bruce Korb
*
- * AutoOpts is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
+ * AutoOpts is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
*
- * AutoOpts 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
- * Lesser General Public License for more details.
+ * AutoOpts 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 Lesser General Public License for more details.
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with AutoOpts. If not, write to:
- * The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301, USA.
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef AUTOOPTS_OPTIONS_H_GUARD
-#define AUTOOPTS_OPTIONS_H_GUARD
+#define AUTOOPTS_OPTIONS_H_GUARD 1
#include <sys/types.h>
+#include <stdio.h>
#if defined(HAVE_STDINT_H)
# include <stdint.h>
* values for "opt_name" are available.
*/
-#define OPTIONS_STRUCT_VERSION 118784
-#define OPTIONS_VERSION_STRING "29:0:4"
+#define OPTIONS_STRUCT_VERSION 131073
+#define OPTIONS_VERSION_STRING "32:1:7"
#define OPTIONS_MINIMUM_VERSION 102400
#define OPTIONS_MIN_VER_STRING "25:0:0"
OPARG_TYPE_BOOLEAN = 3, /* opt arg is boolean-valued */
OPARG_TYPE_MEMBERSHIP = 4, /* opt arg sets set membership bits */
OPARG_TYPE_NUMERIC = 5, /* opt arg has numeric value */
- OPARG_TYPE_HIERARCHY = 6 /* option arg is hierarchical value */
+ OPARG_TYPE_HIERARCHY = 6, /* option arg is hierarchical value */
+ OPARG_TYPE_FILE = 7, /* option arg names a file */
+ OPARG_TYPE_TIME = 8 /* opt arg is a time duration */
} teOptArgType;
typedef struct optionValue {
} v;
} tOptionValue;
+typedef enum {
+ FTYPE_MODE_MAY_EXIST = 0x00,
+ FTYPE_MODE_MUST_EXIST = 0x01,
+ FTYPE_MODE_MUST_NOT_EXIST = 0x02,
+ FTYPE_MODE_EXIST_MASK = 0x03,
+ FTYPE_MODE_NO_OPEN = 0x00,
+ FTYPE_MODE_OPEN_FD = 0x10,
+ FTYPE_MODE_FOPEN_FP = 0x20,
+ FTYPE_MODE_OPEN_MASK = 0x30
+} teOptFileType;
+
+typedef union {
+ int file_flags;
+ char const * file_mode;
+} tuFileMode;
+
/*
* Bits in the fOptState option descriptor field.
*/
OPTST_SET_ID = 0, /* Set via the "SET_OPT()" macro */
OPTST_PRESET_ID = 1, /* Set via an RC/INI file */
OPTST_DEFINED_ID = 2, /* Set via a command line option */
+ OPTST_RESET_ID = 3, /* Reset via command line option */
OPTST_EQUIVALENCE_ID = 4, /* selected by equiv'ed option */
OPTST_DISABLED_ID = 5, /* option is in disabled state */
OPTST_ALLOC_ARG_ID = 6, /* pzOptArg was allocated */
OPTST_MUST_SET_ID = 20, /* must be set or pre-set */
OPTST_DOCUMENT_ID = 21, /* opt is for doc only */
OPTST_TWICE_ID = 22, /* process opt twice - imm + reg */
- OPTST_DISABLE_TWICE_ID = 23 /* process disabled option twice */
+ OPTST_DISABLE_TWICE_ID = 23, /* process disabled option twice */
+ OPTST_SCALED_NUM_ID = 24, /* scaled integer value */
+ OPTST_NO_COMMAND_ID = 25, /* disable from cmd line */
+ OPTST_DEPRECATED_ID = 26 /* support is being removed */
} opt_state_enum_t;
#define OPTST_INIT 0U
#define OPTST_SET (1U << OPTST_SET_ID)
#define OPTST_PRESET (1U << OPTST_PRESET_ID)
#define OPTST_DEFINED (1U << OPTST_DEFINED_ID)
+#define OPTST_RESET (1U << OPTST_RESET_ID)
#define OPTST_EQUIVALENCE (1U << OPTST_EQUIVALENCE_ID)
#define OPTST_DISABLED (1U << OPTST_DISABLED_ID)
#define OPTST_ALLOC_ARG (1U << OPTST_ALLOC_ARG_ID)
#define OPTST_DOCUMENT (1U << OPTST_DOCUMENT_ID)
#define OPTST_TWICE (1U << OPTST_TWICE_ID)
#define OPTST_DISABLE_TWICE (1U << OPTST_DISABLE_TWICE_ID)
-#define OPT_STATE_MASK 0x00FFFF77U
+#define OPTST_SCALED_NUM (1U << OPTST_SCALED_NUM_ID)
+#define OPTST_NO_COMMAND (1U << OPTST_NO_COMMAND_ID)
+#define OPTST_DEPRECATED (1U << OPTST_DEPRECATED_ID)
+#define OPT_STATE_MASK 0x07FFFF7FU
#define OPTST_SET_MASK ( \
OPTST_SET | \
OPTST_PRESET | \
+ OPTST_RESET | \
OPTST_DEFINED )
#define OPTST_MUTABLE_MASK ( \
OPTST_SET | \
OPTST_PRESET | \
+ OPTST_RESET | \
OPTST_DEFINED | \
OPTST_EQUIVALENCE | \
OPTST_DISABLED | \
OPTST_ARG_TYPE_3 | \
OPTST_ARG_TYPE_4 )
+#define OPTST_DO_NOT_SAVE_MASK ( \
+ OPTST_NO_INIT | \
+ OPTST_DOCUMENT | \
+ OPTST_OMITTED )
+
+#define OPTST_NO_USAGE_MASK ( \
+ OPTST_OMITTED | \
+ OPTST_NO_COMMAND | \
+ OPTST_DEPRECATED )
+
#ifdef NO_OPTIONAL_OPT_ARGS
# undef OPTST_ARG_OPTIONAL
# define OPTST_ARG_OPTIONAL 0
#define OPTST_PERSISTENT_MASK (~OPTST_MUTABLE_MASK)
-#define SELECTED_OPT( pod ) ((pod)->fOptState & OPTST_SELECTED_MASK)
-#define UNUSED_OPT( pod ) (((pod)->fOptState & OPTST_SET_MASK) == 0)
-#define DISABLED_OPT( pod ) ((pod)->fOptState & OPTST_DISABLED)
-#define OPTION_STATE( pod ) ((pod)->fOptState)
-
-#define OPTST_SET_ARGTYPE(n) ((n) << OPTST_ARG_TYPE_1_ID)
-#define OPTST_GET_ARGTYPE(f) (((f) & OPTST_ARG_TYPE_MASK)>>OPTST_ARG_TYPE_1_ID)
+#define SELECTED_OPT(_od) ((_od)->fOptState & OPTST_SELECTED_MASK)
+#define UNUSED_OPT( _od) (((_od)->fOptState & OPTST_SET_MASK) == 0)
+#define DISABLED_OPT(_od) ((_od)->fOptState & OPTST_DISABLED)
+#define OPTION_STATE(_od) ((_od)->fOptState)
+#define OPTST_SET_ARGTYPE(_n) ((_n) << OPTST_ARG_TYPE_1_ID)
+#define OPTST_GET_ARGTYPE(_f) (((_f)&OPTST_ARG_TYPE_MASK)>>OPTST_ARG_TYPE_1_ID)
/*
* PRIVATE INTERFACES
* Define the processing state flags
*/
typedef enum {
- OPTPROC_LONGOPT_ID = 0, /* Process long style options */
- OPTPROC_SHORTOPT_ID = 1, /* Process short style "flags" */
- OPTPROC_ERRSTOP_ID = 2, /* Stop on argument errors */
- OPTPROC_DISABLEDOPT_ID = 3, /* Current option is disabled */
- OPTPROC_NO_REQ_OPT_ID = 4, /* no options are required */
- OPTPROC_NUM_OPT_ID = 5, /* there is a number option */
- OPTPROC_INITDONE_ID = 6, /* have initializations been done? */
- OPTPROC_NEGATIONS_ID = 7, /* any negation options? */
- OPTPROC_ENVIRON_ID = 8, /* check environment? */
- OPTPROC_NO_ARGS_ID = 9, /* Disallow remaining arguments */
- OPTPROC_ARGS_REQ_ID = 10, /* Require arguments after options */
- OPTPROC_REORDER_ID = 11, /* reorder operands after options */
- OPTPROC_GNUUSAGE_ID = 12, /* emit usage in GNU style */
- OPTPROC_TRANSLATE_ID = 13, /* Translate strings in tOptions */
- OPTPROC_HAS_IMMED_ID = 14, /* program defines immed options */
- OPTPROC_PRESETTING_ID = 19 /* opt processing in preset state */
+ OPTPROC_LONGOPT_ID = 0, /* Process long style options */
+ OPTPROC_SHORTOPT_ID = 1, /* Process short style "flags" */
+ OPTPROC_ERRSTOP_ID = 2, /* Stop on argument errors */
+ OPTPROC_DISABLEDOPT_ID = 3, /* Current option is disabled */
+ OPTPROC_NO_REQ_OPT_ID = 4, /* no options are required */
+ OPTPROC_NUM_OPT_ID = 5, /* there is a number option */
+ OPTPROC_INITDONE_ID = 6, /* have inits been done? */
+ OPTPROC_NEGATIONS_ID = 7, /* any negation options? */
+ OPTPROC_ENVIRON_ID = 8, /* check environment? */
+ OPTPROC_NO_ARGS_ID = 9, /* Disallow remaining arguments */
+ OPTPROC_ARGS_REQ_ID = 10, /* Require args after options */
+ OPTPROC_REORDER_ID = 11, /* reorder operands after opts */
+ OPTPROC_GNUUSAGE_ID = 12, /* emit usage in GNU style */
+ OPTPROC_TRANSLATE_ID = 13, /* Translate strings in tOptions */
+ OPTPROC_NXLAT_OPT_CFG_ID = 16, /* suppress for config only */
+ OPTPROC_NXLAT_OPT_ID = 17, /* suppress xlation always */
+ OPTPROC_PRESETTING_ID = 19 /* opt processing in preset state */
} optproc_state_enum_t;
-#define OPTPROC_NONE 0U
-#define OPTPROC_LONGOPT (1U << OPTPROC_LONGOPT_ID)
-#define OPTPROC_SHORTOPT (1U << OPTPROC_SHORTOPT_ID)
-#define OPTPROC_ERRSTOP (1U << OPTPROC_ERRSTOP_ID)
-#define OPTPROC_DISABLEDOPT (1U << OPTPROC_DISABLEDOPT_ID)
-#define OPTPROC_NO_REQ_OPT (1U << OPTPROC_NO_REQ_OPT_ID)
-#define OPTPROC_NUM_OPT (1U << OPTPROC_NUM_OPT_ID)
-#define OPTPROC_INITDONE (1U << OPTPROC_INITDONE_ID)
-#define OPTPROC_NEGATIONS (1U << OPTPROC_NEGATIONS_ID)
-#define OPTPROC_ENVIRON (1U << OPTPROC_ENVIRON_ID)
-#define OPTPROC_NO_ARGS (1U << OPTPROC_NO_ARGS_ID)
-#define OPTPROC_ARGS_REQ (1U << OPTPROC_ARGS_REQ_ID)
-#define OPTPROC_REORDER (1U << OPTPROC_REORDER_ID)
-#define OPTPROC_GNUUSAGE (1U << OPTPROC_GNUUSAGE_ID)
-#define OPTPROC_TRANSLATE (1U << OPTPROC_TRANSLATE_ID)
-#define OPTPROC_HAS_IMMED (1U << OPTPROC_HAS_IMMED_ID)
-#define OPTPROC_PRESETTING (1U << OPTPROC_PRESETTING_ID)
-#define OPTPROC_STATE_MASK 0x00087FFFU
+#define OPTPROC_NONE 0U
+#define OPTPROC_LONGOPT (1U << OPTPROC_LONGOPT_ID)
+#define OPTPROC_SHORTOPT (1U << OPTPROC_SHORTOPT_ID)
+#define OPTPROC_ERRSTOP (1U << OPTPROC_ERRSTOP_ID)
+#define OPTPROC_DISABLEDOPT (1U << OPTPROC_DISABLEDOPT_ID)
+#define OPTPROC_NO_REQ_OPT (1U << OPTPROC_NO_REQ_OPT_ID)
+#define OPTPROC_NUM_OPT (1U << OPTPROC_NUM_OPT_ID)
+#define OPTPROC_INITDONE (1U << OPTPROC_INITDONE_ID)
+#define OPTPROC_NEGATIONS (1U << OPTPROC_NEGATIONS_ID)
+#define OPTPROC_ENVIRON (1U << OPTPROC_ENVIRON_ID)
+#define OPTPROC_NO_ARGS (1U << OPTPROC_NO_ARGS_ID)
+#define OPTPROC_ARGS_REQ (1U << OPTPROC_ARGS_REQ_ID)
+#define OPTPROC_REORDER (1U << OPTPROC_REORDER_ID)
+#define OPTPROC_GNUUSAGE (1U << OPTPROC_GNUUSAGE_ID)
+#define OPTPROC_TRANSLATE (1U << OPTPROC_TRANSLATE_ID)
+#define OPTPROC_NXLAT_OPT_CFG (1U << OPTPROC_NXLAT_OPT_CFG_ID)
+#define OPTPROC_NXLAT_OPT (1U << OPTPROC_NXLAT_OPT_ID)
+#define OPTPROC_PRESETTING (1U << OPTPROC_PRESETTING_ID)
+#define OPTPROC_STATE_MASK 0x000B3FFFU
+
+#define OPTPROC_NO_XLAT_MASK ( \
+ OPTPROC_NXLAT_OPT_CFG | \
+ OPTPROC_NXLAT_OPT )
#define STMTS(s) do { s; } while (0)
typedef struct options tOptions;
typedef struct optDesc tOptDesc;
typedef struct optNames tOptNames;
+#define OPTPROC_EMIT_USAGE ((tOptions *)0x01UL)
+#define OPTPROC_EMIT_SHELL ((tOptions *)0x02UL)
+#define OPTPROC_RETURN_VALNAME ((tOptions *)0x03UL)
+#define OPTPROC_EMIT_LIMIT ((tOptions *)0x0FUL)
/*
* The option procedures do the special processing for each
* option flag that needs it.
*/
-typedef void (tOptProc)( tOptions* pOpts, tOptDesc* pOptDesc );
+typedef void (tOptProc)(tOptions* pOpts, tOptDesc* pOptDesc);
typedef tOptProc* tpOptProc;
/*
* The usage procedure will never return. It calls "exit(2)"
* with the "exitCode" argument passed to it.
*/
-typedef void (tUsageProc)( tOptions* pOpts, int exitCode );
+typedef void (tUsageProc)(tOptions* pOpts, int exitCode);
typedef tUsageProc* tpUsageProc;
/*
long argInt;
unsigned long argUint;
unsigned int argBool;
+ FILE* argFp;
+ int argFd;
} optArgBucket_t;
/*
# define pzLastArg optArg.argString
void* optCookie; /* PUBLIC */
- const int * pOptMust;
- const int * pOptCant;
- tpOptProc pOptProc;
- char const* pzText;
+ int const * const pOptMust;
+ int const * const pOptCant;
+ tpOptProc const pOptProc;
+ char const* const pzText;
- char const* pz_NAME;
- char const* pz_Name;
- char const* pz_DisableName;
- char const* pz_DisablePfx;
+ char const* const pz_NAME;
+ char const* const pz_Name;
+ char const* const pz_DisableName;
+ char const* const pz_DisablePfx;
};
/*
unsigned int curOptIdx;
char* pzCurOpt;
- char const* pzProgPath;
- char const* pzProgName;
- char const* const pzPROGNAME;
- char const* const pzRcName;
- char const* const pzCopyright;
- char const* const pzCopyNotice;
- char const* const pzFullVersion;
+ char const* pzProgPath; /* PUBLIC */
+ char const* pzProgName; /* PUBLIC */
+ char const* const pzPROGNAME; /* PUBLIC */
+ char const* const pzRcName; /* PUBLIC */
+ char const* const pzCopyright; /* PUBLIC */
+ char const* const pzCopyNotice; /* PUBLIC */
+ char const* const pzFullVersion; /* PUBLIC */
char const* const* const papzHomeList;
char const* const pzUsageTitle;
char const* const pzExplain;
char const* const pzDetail;
- tOptDesc* const pOptDesc;
- char const* const pzBugAddr;
+ tOptDesc* const pOptDesc; /* PUBLIC */
+ char const* const pzBugAddr; /* PUBLIC */
void* pExtensions;
void* pSavedState;
tOptSpecIndex specOptIdx;
int const optCt;
int const presetOptCt;
+ char const * pzFullUsage;
+ char const * pzShortUsage;
+ /* PUBLIC: */
+ optArgBucket_t const * const originalOptArgArray;
+ void * const * const originalOptArgCookie;
};
+/*
+ * Versions where in various fields first appear:
+ * ($AO_CURRENT * 4096 + $AO_REVISION, but $AO_REVISION must be zero)
+ */
+#define originalOptArgArray_STRUCT_VERSION 131072 /* AO_CURRENT = 32 */
+#define HAS_originalOptArgArray(_opt) \
+ ((_opt)->structVersion >= originalOptArgArray_STRUCT_VERSION)
+
/*
* "token list" structure returned by "string_tokenize()"
*/
* The following routines may be coded into AutoOpts client code:
*/
-/* From: tokenize.c line 115
+/* From: tokenize.c line 117
*
* ao_string_tokenize - tokenize an input string
*
* Double quote strings are formed according to the rules of string
* constants in ANSI-C programs.
*/
-extern token_list_t* ao_string_tokenize( char const* );
+extern token_list_t* ao_string_tokenize(char const*);
-/* From: configfile.c line 113
+/* From: configfile.c line 85
*
* configFileLoad - parse a configuration file
*
* @code{optionGetValue()}, @code{optionNextValue()} and
* @code{optionUnloadNested()}.
*/
-extern const tOptionValue* configFileLoad( char const* );
+extern const tOptionValue* configFileLoad(char const*);
-/* From: configfile.c line 883
+/* From: configfile.c line 897
*
* optionFileLoad - Load the locatable config files, in order
*
*
* Configuration files not found or not decipherable are simply ignored.
*/
-extern int optionFileLoad( tOptions*, char const* );
+extern int optionFileLoad(tOptions*, char const*);
-/* From: configfile.c line 245
+/* From: configfile.c line 217
*
* optionFindNextValue - find a hierarcicaly valued option instance
*
* configurable. It will search through the list and return the next entry
* that matches the criteria.
*/
-extern const tOptionValue* optionFindNextValue( const tOptDesc*, const tOptionValue*, char const*, char const* );
+extern const tOptionValue* optionFindNextValue(const tOptDesc*, const tOptionValue*, char const*, char const*);
-/* From: configfile.c line 171
+/* From: configfile.c line 143
*
* optionFindValue - find a hierarcicaly valued option instance
*
* This routine will find an entry in a nested value option or configurable.
* It will search through the list and return a matching entry.
*/
-extern const tOptionValue* optionFindValue( const tOptDesc*, char const*, char const* );
+extern const tOptionValue* optionFindValue(const tOptDesc*, char const*, char const*);
-/* From: restore.c line 188
+/* From: restore.c line 165
*
* optionFree - free allocated option processing memory
*
* AutoOpts sometimes allocates memory and puts pointers to it in the
* option state structures. This routine deallocates all such memory.
*/
-extern void optionFree( tOptions* );
+extern void optionFree(tOptions*);
-/* From: configfile.c line 314
+/* From: configfile.c line 286
*
* optionGetValue - get a specific value from a hierarcical list
*
* the first entry with a name that exactly matches the argument will be
* returned.
*/
-extern const tOptionValue* optionGetValue( const tOptionValue*, char const* );
+extern const tOptionValue* optionGetValue(const tOptionValue*, char const*);
-/* From: load.c line 521
+/* From: load.c line 498
*
* optionLoadLine - process a string for an option name and value
*
* formation used in AutoGen definition files (@pxref{basic expression}),
* except that you may not use backquotes.
*/
-extern void optionLoadLine( tOptions*, char const* );
+extern void optionLoadLine(tOptions*, char const*);
-/* From: configfile.c line 373
+/* From: configfile.c line 345
*
* optionNextValue - get the next value from a hierarchical list
*
* The "@var{pOldValue}" must have been gotten from a prior call to this
* routine or to "@code{opitonGetValue()}".
*/
-extern const tOptionValue* optionNextValue( const tOptionValue*, const tOptionValue* );
+extern const tOptionValue* optionNextValue(const tOptionValue*, const tOptionValue*);
-/* From: usage.c line 128
+/* From: usage.c line 107
*
* optionOnlyUsage - Print usage text for just the options
*
* This function may be used when the emitted usage must incorporate
* information not available to AutoOpts.
*/
-extern void optionOnlyUsage( tOptions*, int );
+extern void optionOnlyUsage(tOptions*, int);
-/* From: autoopts.c line 1012
+/* From: autoopts.c line 1041
*
* optionProcess - this is the main option processing routine
*
* is treated as an operand. Encountering an operand stops option
* processing.
*/
-extern int optionProcess( tOptions*, int, char** );
+extern int optionProcess(tOptions*, int, char**);
-/* From: restore.c line 145
+/* From: restore.c line 122
*
* optionRestore - restore option state from memory copy
*
* to optionProcess(3AO), then you may change the contents of the
* argc/argv parameters to optionProcess.
*/
-extern void optionRestore( tOptions* );
+extern void optionRestore(tOptions*);
-/* From: save.c line 334
+/* From: save.c line 670
*
* optionSaveFile - saves the option state to a file
*
* @code{homerc} attribute. If no @code{rcfile} attribute was specified, it
* will default to @code{.@i{programname}rc}. If you wish to specify another
* file, you should invoke the @code{SET_OPT_SAVE_OPTS( @i{filename} )} macro.
+ *
+ * The recommend usage is as follows:
+ * @example
+ * optionProcess(&progOptions, argc, argv);
+ * if (i_want_a_non_standard_place_for_this)
+ * SET_OPT_SAVE_OPTS("myfilename");
+ * optionSaveFile(&progOptions);
+ * @end example
*/
-extern void optionSaveFile( tOptions* );
+extern void optionSaveFile(tOptions*);
-/* From: restore.c line 93
+/* From: restore.c line 70
*
* optionSaveState - saves the option state to memory
*
* restoring of stacked string arguments and hierarchical values is
* disabled. The values are not saved.
*/
-extern void optionSaveState( tOptions* );
+extern void optionSaveState(tOptions*);
-/* From: nested.c line 559
+/* From: nested.c line 569
*
* optionUnloadNested - Deallocate the memory for a nested value
*
* have been gotten from a call to @code{configFileLoad()} (See
* @pxref{libopts-configFileLoad}).
*/
-extern void optionUnloadNested( tOptionValue const * );
+extern void optionUnloadNested(tOptionValue const *);
-/* From: version.c line 58
+/* From: version.c line 37
*
* optionVersion - return the compiled AutoOpts version number
*
* Returns the full version string compiled into the library.
* The returned string cannot be modified.
*/
-extern char const* optionVersion( void );
+extern char const* optionVersion(void);
-/* From: ../compat/pathfind.c line 34
+/* From: ../compat/pathfind.c line 33
*
* pathfind - fild a file in a list of directories
*
* @end example
*/
#ifndef HAVE_PATHFIND
-extern char* pathfind( char const*, char const*, char const* );
+extern char* pathfind(char const*, char const*, char const*);
#endif /* HAVE_PATHFIND */
-/* From: streqvcmp.c line 233
+/* From: streqvcmp.c line 208
*
* strequate - map a list of characters to the same value
*
* This function name is mapped to option_strequate so as to not conflict
* with the POSIX name space.
*/
-extern void strequate( char const* );
+extern void strequate(char const*);
-/* From: streqvcmp.c line 143
+/* From: streqvcmp.c line 118
*
* streqvcmp - compare two strings with an equivalence mapping
*
* This function name is mapped to option_streqvcmp so as to not conflict
* with the POSIX name space.
*/
-extern int streqvcmp( char const*, char const* );
+extern int streqvcmp(char const*, char const*);
-/* From: streqvcmp.c line 180
+/* From: streqvcmp.c line 155
*
* streqvmap - Set the character mappings for the streqv functions
*
* This function name is mapped to option_streqvmap so as to not conflict
* with the POSIX name space.
*/
-extern void streqvmap( char, char, int );
+extern void streqvmap(char, char, int);
-/* From: streqvcmp.c line 102
+/* From: streqvcmp.c line 77
*
* strneqvcmp - compare two strings with an equivalence mapping
*
* This function name is mapped to option_strneqvcmp so as to not conflict
* with the POSIX name space.
*/
-extern int strneqvcmp( char const*, char const*, int );
+extern int strneqvcmp(char const*, char const*, int);
-/* From: streqvcmp.c line 259
+/* From: streqvcmp.c line 234
*
* strtransform - convert a string into its mapped-to value
*
* character is put into the output.
* This function name is mapped to option_strtransform so as to not conflict
* with the POSIX name space.
+ *
+ * The source and destination may be the same.
*/
-extern void strtransform( char*, char const* );
+extern void strtransform(char*, char const*);
/* AutoOpts PRIVATE FUNCTIONS: */
tOptProc optionStackArg, optionUnstackArg, optionBooleanVal, optionNumericVal;
-extern char* ao_string_cook( char*, int* );
+extern char* ao_string_cook(char*, int*);
+
+extern unsigned int ao_string_cook_escape_char(char const*, char*, unsigned int);
+
+extern void export_options_to_guile(tOptions*);
+
+extern void genshelloptUsage(tOptions*, int);
+
+extern void optionBooleanVal(tOptions*, tOptDesc*);
-extern unsigned int ao_string_cook_escape_char( char const*, char*, unsigned int );
+extern uintptr_t optionEnumerationVal(tOptions*, tOptDesc*, char const * const *, unsigned int);
-extern void export_options_to_guile( tOptions* );
+extern void optionFileCheck(tOptions*, tOptDesc*, teOptFileType, tuFileMode);
-extern void genshelloptUsage( tOptions*, int );
+extern char const* optionKeywordName(tOptDesc*, unsigned int);
-extern void optionBooleanVal( tOptions*, tOptDesc* );
+extern void optionLoadOpt(tOptions*, tOptDesc*);
-extern uintptr_t optionEnumerationVal( tOptions*, tOptDesc*, char const * const *, unsigned int );
+extern ag_bool optionMakePath(char*, int, char const*, char const*);
-extern char const* optionKeywordName( tOptDesc*, unsigned int );
+extern void optionNestedVal(tOptions*, tOptDesc*);
-extern void optionLoadOpt( tOptions*, tOptDesc* );
+extern void optionNumericVal(tOptions*, tOptDesc*);
-extern ag_bool optionMakePath( char*, int, char const*, char const* );
+extern void optionPagedUsage(tOptions*, tOptDesc*);
-extern void optionNestedVal( tOptions*, tOptDesc* );
+extern void optionParseShell(tOptions*);
-extern void optionNumericVal( tOptions*, tOptDesc* );
+extern void optionPrintVersion(tOptions*, tOptDesc*);
-extern void optionPagedUsage( tOptions*, tOptDesc* );
+extern void optionPutShell(tOptions*);
-extern void optionParseShell( tOptions* );
+extern void optionResetOpt(tOptions*, tOptDesc*);
-extern void optionPrintVersion( tOptions*, tOptDesc* );
+extern void optionSetMembers(tOptions*, tOptDesc*, char const * const *, unsigned int);
-extern void optionPutShell( tOptions* );
+extern void optionShowRange(tOptions*, tOptDesc*, void *, int);
-extern void optionSetMembers( tOptions*, tOptDesc*, char const * const *, unsigned int );
+extern void optionStackArg(tOptions*, tOptDesc*);
-extern void optionStackArg( tOptions*, tOptDesc* );
+extern void optionTimeVal(tOptions*, tOptDesc*);
-extern void optionUnstackArg( tOptions*, tOptDesc* );
+extern void optionUnstackArg(tOptions*, tOptDesc*);
-extern void optionUsage( tOptions*, int );
+extern void optionUsage(tOptions*, int);
-extern void optionVersionStderr( tOptions*, tOptDesc* );
+extern void optionVersionStderr(tOptions*, tOptDesc*);
-extern void* text_mmap( char const*, int, int, tmap_info_t* );
+extern void* text_mmap(char const*, int, int, tmap_info_t*);
-extern int text_munmap( tmap_info_t* );
+extern int text_munmap(tmap_info_t*);
CPLUSPLUS_CLOSER
#endif /* AUTOOPTS_OPTIONS_H_GUARD */
*
* DO NOT EDIT THIS FILE (usage-txt.h)
*
- * It has been AutoGen-ed Saturday May 5, 2007 at 12:02:33 PM PDT
+ * It has been AutoGen-ed Saturday May 16, 2009 at 08:15:52 AM PDT
* From the definitions usage-txt.def
* and the template file usage-txt.tpl
*
* This file handles all the bookkeeping required for tracking all the little
- * tiny strings used by the AutoOpts library. There are 113
+ * tiny strings used by the AutoOpts library. There are 130
* of them. This is not versioned because it is entirely internal to the
* library and accessed by client code only in a very well-controlled way:
* they may substitute translated strings using a procedure that steps through
* all the string pointers.
*
- * AutoOpts is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
+ * AutoOpts is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
*
- * AutoOpts 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
- * Lesser General Public License for more details.
+ * AutoOpts 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 Lesser General Public License for more details.
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with AutoOpts. If not, write to:
- * The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301, USA.
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef AUTOOPTS_USAGE_TXT_H_GUARD
-#define AUTOOPTS_USAGE_TXT_H_GUARD
+#define AUTOOPTS_USAGE_TXT_H_GUARD 1
#undef cch_t
#define cch_t char const
int field_ct;
char* utpz_GnuBoolArg;
char* utpz_GnuKeyArg;
+ char* utpz_GnuFileArg;
char* utpz_GnuKeyLArg;
+ char* utpz_GnuTimeArg;
char* utpz_GnuNumArg;
char* utpz_GnuStrArg;
- cch_t* apz_str[ 108 ];
+ cch_t* apz_str[ 123 ];
} usage_text_t;
/*
#define zAO_Big (option_usage_text.apz_str[ 1])
#define zAO_Err (option_usage_text.apz_str[ 2])
#define zAO_Sml (option_usage_text.apz_str[ 3])
-#define zAll (option_usage_text.apz_str[ 4])
-#define zAlt (option_usage_text.apz_str[ 5])
-#define zAmbigKey (option_usage_text.apz_str[ 6])
-#define zAmbiguous (option_usage_text.apz_str[ 7])
-#define zArgsMust (option_usage_text.apz_str[ 8])
-#define zAtMost (option_usage_text.apz_str[ 9])
-#define zAuto (option_usage_text.apz_str[ 10])
-#define zBadPipe (option_usage_text.apz_str[ 11])
-#define zBadVerArg (option_usage_text.apz_str[ 12])
-#define zCantFmt (option_usage_text.apz_str[ 13])
-#define zCantSave (option_usage_text.apz_str[ 14])
-#define zDefaultOpt (option_usage_text.apz_str[ 15])
-#define zDis (option_usage_text.apz_str[ 16])
-#define zEnab (option_usage_text.apz_str[ 17])
-#define zEquiv (option_usage_text.apz_str[ 18])
-#define zErrOnly (option_usage_text.apz_str[ 19])
-#define zExamineFmt (option_usage_text.apz_str[ 20])
-#define zFiveSpaces (option_usage_text.apz_str[ 21])
-#define zFlagOkay (option_usage_text.apz_str[ 22])
-#define zFmtFmt (option_usage_text.apz_str[ 23])
-#define zForkFail (option_usage_text.apz_str[ 24])
-#define zFSErrOptLoad (option_usage_text.apz_str[ 25])
-#define zFSErrReadFile (option_usage_text.apz_str[ 26])
-#define zGenshell (option_usage_text.apz_str[ 27])
+#define zAO_Ver (option_usage_text.apz_str[ 4])
+#define zAO_Woops (option_usage_text.apz_str[ 5])
+#define zAll (option_usage_text.apz_str[ 6])
+#define zAlt (option_usage_text.apz_str[ 7])
+#define zAmbigKey (option_usage_text.apz_str[ 8])
+#define zAmbigOptStr (option_usage_text.apz_str[ 9])
+#define zArgsMust (option_usage_text.apz_str[ 10])
+#define zAtMost (option_usage_text.apz_str[ 11])
+#define zAuto (option_usage_text.apz_str[ 12])
+#define zBadPipe (option_usage_text.apz_str[ 13])
+#define zBadVerArg (option_usage_text.apz_str[ 14])
+#define zCantFmt (option_usage_text.apz_str[ 15])
+#define zCantSave (option_usage_text.apz_str[ 16])
+#define zDefaultOpt (option_usage_text.apz_str[ 17])
+#define zDis (option_usage_text.apz_str[ 18])
+#define zEnab (option_usage_text.apz_str[ 19])
+#define zEquiv (option_usage_text.apz_str[ 20])
+#define zErrOnly (option_usage_text.apz_str[ 21])
+#define zExamineFmt (option_usage_text.apz_str[ 22])
+#define zFiveSpaces (option_usage_text.apz_str[ 23])
+#define zFlagOkay (option_usage_text.apz_str[ 24])
+#define zFmtFmt (option_usage_text.apz_str[ 25])
+#define zForkFail (option_usage_text.apz_str[ 26])
+#define zFSErrOptLoad (option_usage_text.apz_str[ 27])
+#define zFSErrReadFile (option_usage_text.apz_str[ 28])
+#define zFSOptError (option_usage_text.apz_str[ 29])
+#define zFSOptErrMayExist (option_usage_text.apz_str[ 30])
+#define zFSOptErrMustExist (option_usage_text.apz_str[ 31])
+#define zFSOptErrNoExist (option_usage_text.apz_str[ 32])
+#define zFSOptErrOpen (option_usage_text.apz_str[ 33])
+#define zFSOptErrFopen (option_usage_text.apz_str[ 34])
+#define zFileCannotExist (option_usage_text.apz_str[ 35])
+#define zFileMustExist (option_usage_text.apz_str[ 36])
+#define zGenshell (option_usage_text.apz_str[ 37])
#define zGnuBoolArg (option_usage_text.utpz_GnuBoolArg)
-#define zGnuBreak (option_usage_text.apz_str[ 28])
+#define zGnuBreak (option_usage_text.apz_str[ 38])
#define zGnuKeyArg (option_usage_text.utpz_GnuKeyArg)
+#define zGnuFileArg (option_usage_text.utpz_GnuFileArg)
#define zGnuKeyLArg (option_usage_text.utpz_GnuKeyLArg)
-#define zGnuNestArg (option_usage_text.apz_str[ 29])
+#define zGnuTimeArg (option_usage_text.utpz_GnuTimeArg)
+#define zGnuNestArg (option_usage_text.apz_str[ 39])
#define zGnuNumArg (option_usage_text.utpz_GnuNumArg)
-#define zGnuOptArg (option_usage_text.apz_str[ 30])
-#define zGnuOptFmt (option_usage_text.apz_str[ 31])
+#define zGnuOptArg (option_usage_text.apz_str[ 40])
+#define zGnuOptFmt (option_usage_text.apz_str[ 41])
#define zGnuStrArg (option_usage_text.utpz_GnuStrArg)
-#define zIllOptChr (option_usage_text.apz_str[ 32])
-#define zIllOptStr (option_usage_text.apz_str[ 33])
-#define zIllegal (option_usage_text.apz_str[ 34])
-#define zInvalOptDesc (option_usage_text.apz_str[ 35])
-#define zKeyWords (option_usage_text.apz_str[ 36])
-#define zLoadCooked (option_usage_text.apz_str[ 37])
-#define zLoadKeep (option_usage_text.apz_str[ 38])
-#define zLoadType (option_usage_text.apz_str[ 39])
-#define zLoadUncooked (option_usage_text.apz_str[ 40])
-#define zLtypeInteger (option_usage_text.apz_str[ 41])
-#define zLtypeNest (option_usage_text.apz_str[ 42])
-#define zLtypeString (option_usage_text.apz_str[ 43])
-#define zLtypeBool (option_usage_text.apz_str[ 44])
-#define zLtypeKeyword (option_usage_text.apz_str[ 45])
-#define zLtypeSetMembership (option_usage_text.apz_str[ 46])
-#define zMembers (option_usage_text.apz_str[ 47])
-#define zMisArg (option_usage_text.apz_str[ 48])
-#define zMultiEquiv (option_usage_text.apz_str[ 49])
-#define zMust (option_usage_text.apz_str[ 50])
-#define zNeedOne (option_usage_text.apz_str[ 51])
-#define zNoArg (option_usage_text.apz_str[ 52])
-#define zNoArgs (option_usage_text.apz_str[ 53])
-#define zNoCreat (option_usage_text.apz_str[ 54])
-#define zNoFlags (option_usage_text.apz_str[ 55])
-#define zNoKey (option_usage_text.apz_str[ 56])
-#define zNoLim (option_usage_text.apz_str[ 57])
-#define zNoPreset (option_usage_text.apz_str[ 58])
-#define zNoRq_NoShrtTtl (option_usage_text.apz_str[ 59])
-#define zNoRq_ShrtTtl (option_usage_text.apz_str[ 60])
-#define zNoStat (option_usage_text.apz_str[ 61])
-#define zNoState (option_usage_text.apz_str[ 62])
-#define zNone (option_usage_text.apz_str[ 63])
-#define zNotDef (option_usage_text.apz_str[ 64])
-#define zNotEnough (option_usage_text.apz_str[ 65])
-#define zNotFile (option_usage_text.apz_str[ 66])
-#define zNotNumber (option_usage_text.apz_str[ 67])
-#define zNrmOptFmt (option_usage_text.apz_str[ 68])
-#define zNumberOpt (option_usage_text.apz_str[ 69])
-#define zOneSpace (option_usage_text.apz_str[ 70])
-#define zOnlyOne (option_usage_text.apz_str[ 71])
-#define zOptsOnly (option_usage_text.apz_str[ 72])
-#define zPathFmt (option_usage_text.apz_str[ 73])
-#define zPlsSendBugs (option_usage_text.apz_str[ 74])
-#define zPreset (option_usage_text.apz_str[ 75])
-#define zPresetFile (option_usage_text.apz_str[ 76])
-#define zPresetIntro (option_usage_text.apz_str[ 77])
-#define zProg (option_usage_text.apz_str[ 78])
-#define zProhib (option_usage_text.apz_str[ 79])
-#define zReorder (option_usage_text.apz_str[ 80])
-#define zReqFmt (option_usage_text.apz_str[ 81])
-#define zReqOptFmt (option_usage_text.apz_str[ 82])
-#define zReqThese (option_usage_text.apz_str[ 83])
-#define zReq_NoShrtTtl (option_usage_text.apz_str[ 84])
-#define zReq_ShrtTtl (option_usage_text.apz_str[ 85])
-#define zSepChars (option_usage_text.apz_str[ 86])
-#define zSetMembers (option_usage_text.apz_str[ 87])
-#define zSetMemberSettings (option_usage_text.apz_str[ 88])
-#define zShrtGnuOptFmt (option_usage_text.apz_str[ 89])
-#define zSixSpaces (option_usage_text.apz_str[ 90])
-#define zStdBoolArg (option_usage_text.apz_str[ 91])
-#define zStdBreak (option_usage_text.apz_str[ 92])
-#define zStdKeyArg (option_usage_text.apz_str[ 93])
-#define zStdKeyLArg (option_usage_text.apz_str[ 94])
-#define zStdNestArg (option_usage_text.apz_str[ 95])
-#define zStdNoArg (option_usage_text.apz_str[ 96])
-#define zStdNumArg (option_usage_text.apz_str[ 97])
-#define zStdOptArg (option_usage_text.apz_str[ 98])
-#define zStdReqArg (option_usage_text.apz_str[ 99])
-#define zStdStrArg (option_usage_text.apz_str[100])
-#define zTabHyp (option_usage_text.apz_str[101])
-#define zTabHypAnd (option_usage_text.apz_str[102])
-#define zTabout (option_usage_text.apz_str[103])
-#define zThreeSpaces (option_usage_text.apz_str[104])
-#define zTwoSpaces (option_usage_text.apz_str[105])
-#define zUpTo (option_usage_text.apz_str[106])
-#define zValidKeys (option_usage_text.apz_str[107])
+#define zIllOptChr (option_usage_text.apz_str[ 42])
+#define zIllOptStr (option_usage_text.apz_str[ 43])
+#define zIllegal (option_usage_text.apz_str[ 44])
+#define zIntRange (option_usage_text.apz_str[ 45])
+#define zInvalOptDesc (option_usage_text.apz_str[ 46])
+#define zLowerBits (option_usage_text.apz_str[ 47])
+#define zMembers (option_usage_text.apz_str[ 48])
+#define zMisArg (option_usage_text.apz_str[ 49])
+#define zMultiEquiv (option_usage_text.apz_str[ 50])
+#define zMust (option_usage_text.apz_str[ 51])
+#define zNeedOne (option_usage_text.apz_str[ 52])
+#define zNoArg (option_usage_text.apz_str[ 53])
+#define zNoArgs (option_usage_text.apz_str[ 54])
+#define zNoCreat (option_usage_text.apz_str[ 55])
+#define zNoFlags (option_usage_text.apz_str[ 56])
+#define zNoKey (option_usage_text.apz_str[ 57])
+#define zNoLim (option_usage_text.apz_str[ 58])
+#define zNoPreset (option_usage_text.apz_str[ 59])
+#define zNoResetArg (option_usage_text.apz_str[ 60])
+#define zNoRq_NoShrtTtl (option_usage_text.apz_str[ 61])
+#define zNoRq_ShrtTtl (option_usage_text.apz_str[ 62])
+#define zNoStat (option_usage_text.apz_str[ 63])
+#define zNoState (option_usage_text.apz_str[ 64])
+#define zNone (option_usage_text.apz_str[ 65])
+#define zNotDef (option_usage_text.apz_str[ 66])
+#define zNotCmdOpt (option_usage_text.apz_str[ 67])
+#define zNotEnough (option_usage_text.apz_str[ 68])
+#define zNotFile (option_usage_text.apz_str[ 69])
+#define zNotNumber (option_usage_text.apz_str[ 70])
+#define zNrmOptFmt (option_usage_text.apz_str[ 71])
+#define zNumberOpt (option_usage_text.apz_str[ 72])
+#define zOneSpace (option_usage_text.apz_str[ 73])
+#define zOnlyOne (option_usage_text.apz_str[ 74])
+#define zOptsOnly (option_usage_text.apz_str[ 75])
+#define zPathFmt (option_usage_text.apz_str[ 76])
+#define zPlsSendBugs (option_usage_text.apz_str[ 77])
+#define zPreset (option_usage_text.apz_str[ 78])
+#define zPresetFile (option_usage_text.apz_str[ 79])
+#define zPresetIntro (option_usage_text.apz_str[ 80])
+#define zProg (option_usage_text.apz_str[ 81])
+#define zProhib (option_usage_text.apz_str[ 82])
+#define zReorder (option_usage_text.apz_str[ 83])
+#define zRange (option_usage_text.apz_str[ 84])
+#define zRangeAbove (option_usage_text.apz_str[ 85])
+#define zRangeLie (option_usage_text.apz_str[ 86])
+#define zRangeBadLie (option_usage_text.apz_str[ 87])
+#define zRangeOnly (option_usage_text.apz_str[ 88])
+#define zRangeOr (option_usage_text.apz_str[ 89])
+#define zRangeErr (option_usage_text.apz_str[ 90])
+#define zRangeExact (option_usage_text.apz_str[ 91])
+#define zRangeScaled (option_usage_text.apz_str[ 92])
+#define zRangeUpto (option_usage_text.apz_str[ 93])
+#define zResetNotConfig (option_usage_text.apz_str[ 94])
+#define zReqFmt (option_usage_text.apz_str[ 95])
+#define zReqOptFmt (option_usage_text.apz_str[ 96])
+#define zReqThese (option_usage_text.apz_str[ 97])
+#define zReq_NoShrtTtl (option_usage_text.apz_str[ 98])
+#define zReq_ShrtTtl (option_usage_text.apz_str[ 99])
+#define zSepChars (option_usage_text.apz_str[100])
+#define zSetMemberSettings (option_usage_text.apz_str[101])
+#define zShrtGnuOptFmt (option_usage_text.apz_str[102])
+#define zSixSpaces (option_usage_text.apz_str[103])
+#define zStdBoolArg (option_usage_text.apz_str[104])
+#define zStdBreak (option_usage_text.apz_str[105])
+#define zStdFileArg (option_usage_text.apz_str[106])
+#define zStdKeyArg (option_usage_text.apz_str[107])
+#define zStdKeyLArg (option_usage_text.apz_str[108])
+#define zStdTimeArg (option_usage_text.apz_str[109])
+#define zStdNestArg (option_usage_text.apz_str[110])
+#define zStdNoArg (option_usage_text.apz_str[111])
+#define zStdNumArg (option_usage_text.apz_str[112])
+#define zStdOptArg (option_usage_text.apz_str[113])
+#define zStdReqArg (option_usage_text.apz_str[114])
+#define zStdStrArg (option_usage_text.apz_str[115])
+#define zTabHyp (option_usage_text.apz_str[116])
+#define zTabHypAnd (option_usage_text.apz_str[117])
+#define zTabout (option_usage_text.apz_str[118])
+#define zThreeSpaces (option_usage_text.apz_str[119])
+#define zTwoSpaces (option_usage_text.apz_str[120])
+#define zUpTo (option_usage_text.apz_str[121])
+#define zValidKeys (option_usage_text.apz_str[122])
/*
* First, set up the strings. Some of these are writable. These are all in
static char eng_zGnuBoolArg[] = "=T/F";
static char eng_zGnuKeyArg[] = "=KWd";
+ static char eng_zGnuFileArg[] = "=file";
static char eng_zGnuKeyLArg[] = "=Mbr";
+ static char eng_zGnuTimeArg[] = "=Tim";
static char eng_zGnuNumArg[] = "=num";
static char eng_zGnuStrArg[] = "=str";
-static char const usage_txt[3208] =
+static char const usage_txt[4024] =
"AutoOpts function called without option descriptor\n\0"
"\tThis exceeds the compiled library version: \0"
"Automated Options Processing Error!\n"
"\t%s called AutoOpts function with structure version %d:%d:%d.\n\0"
"\tThis is less than the minimum library version: \0"
+ "Automated Options version %s\n"
+ "\tcopyright (c) 1999-2009 by Bruce Korb - all rights reserved\n\0"
+ "AutoOpts lib error: defaulted to option with optional arg\n\0"
"all\0"
"\t\t\t\t- an alternate for %s\n\0"
"%s error: the keyword `%s' is ambiguous for %s\n\0"
- "ambiguous\0"
+ "%s: ambiguous option -- %s\n\0"
"%s: Command line arguments required\n\0"
"%d %s%s options allowed\n\0"
"version and help options:\0"
"fs error %d (%s) on fork - cannot obtain %s usage\n\0"
"File error %d (%s) opening %s for loading options\n\0"
"fs error %d (%s) reading file %s\n\0"
+ "fs error %d (%s) on %s %s for option %s\n\0"
+ "stat-ing for directory\0"
+ "stat-ing for regular file\0"
+ "stat-ing for non-existant file\0"
+ "open-ing file\0"
+ "fopen-ing file\0"
+ "\t\t\t\t- file must not pre-exist\n\0"
+ "\t\t\t\t- file must pre-exist\n\0"
"\n"
"= = = = = = = =\n\n"
"This incarnation of genshell will produce\n"
"[=arg]\0"
"--%2$s%1$s\0"
"%s: illegal option -- %c\n\0"
- "%s: %s option -- %s\n\0"
+ "%s: illegal option -- %s\n\0"
"illegal\0"
+ " or an integer from %d through %d\n\0"
"AutoOpts ERROR: invalid option descriptor for %s\n\0"
- "words=\0"
- "cooked\0"
- "keep\0"
- "type=\0"
- "uncooked\0"
- "integer\0"
- "nested\0"
- "string\0"
- "bool\0"
- "keyword\0"
- "set\0"
+ " or an integer mask with any of the lower %d bits set\n\0"
"\t\t\t\t- is a set membership option\n\0"
"%s: option `%s' requires an argument\n\0"
"Equivalenced option '%s' was equivalenced to both\n"
"%s error: `%s' does not match any %s keywords\n\0"
"\t\t\t\t- may appear multiple times\n\0"
"\t\t\t\t- may not be preset\n\0"
+ "The 'reset-option' option requires an argument\n\0"
" Arg Option-Name Description\n\0"
" Flg Arg Option-Name Description\n\0"
"error %d (%s) stat-ing %s\n\0"
"%s(optionRestore): error: no saved option state\n\0"
"none\0"
"'%s' not defined\n\0"
+ "'%s' is not a command line option\n\0"
"ERROR: The %s option must appear %d times\n\0"
"error: cannot load options from non-regular file %s\n\0"
"%s error: `%s' is not a recognizable number\n\0"
"program\0"
"prohibits these options:\n\0"
"Operands and options may be intermixed. They will be reordered.\n\0"
+ "%s%ld to %ld\0"
+ "%sgreater than or equal to %ld\0"
+ "%sIt must lie in one of the ranges:\n\0"
+ "%sThis option must lie in one of the ranges:\n\0"
+ "%sit must be: \0"
+ ", or\n\0"
+ "%s error: %s option value ``%s'' is out of range.\n\0"
+ "%s%ld exactly\0"
+ "%sis scalable with a suffix: k/K/m/M/g/G/t/T\n\0"
+ "%sless than or equal to %ld\0"
+ "The --reset-option has not been configured.\n\0"
"ERROR: %s option requires the %s option\n\0"
" %3s %-14s %s\0"
"requires these options:\n\0"
" Arg Option-Name Req? Description\n\0"
" Flg Arg Option-Name Req? Description\n\0"
"-_^\0"
- "members=\0"
"or you may use a numeric representation. Preceding these with a '!' will\n"
"clear the bits, specifying 'none' will clear all bits, and 'all' will set them\n"
"all. Multiple entries may be passed as an option argument list.\n\0"
"\n"
"%s\n\n"
"%s\0"
+ "Fil\0"
"KWd\0"
"Mbr\0"
+ "Tim\0"
"Cpx\0"
"no \0"
"Num\0"
* Aren't you glad you don't maintain this by hand?
*/
usage_text_t option_usage_text = {
- 113,
- eng_zGnuBoolArg, eng_zGnuKeyArg, eng_zGnuKeyLArg, eng_zGnuNumArg,
- eng_zGnuStrArg,
+ 130,
+ eng_zGnuBoolArg, eng_zGnuKeyArg, eng_zGnuFileArg, eng_zGnuKeyLArg,
+ eng_zGnuTimeArg, eng_zGnuNumArg, eng_zGnuStrArg,
{
usage_txt + 0, usage_txt + 52, usage_txt + 98, usage_txt + 197,
- usage_txt + 247, usage_txt + 251, usage_txt + 278, usage_txt + 327,
- usage_txt + 337, usage_txt + 374, usage_txt + 399, usage_txt + 425,
- usage_txt + 465, usage_txt + 602, usage_txt + 650, usage_txt + 704,
- usage_txt + 746, usage_txt + 770, usage_txt + 796, usage_txt + 809,
- usage_txt + 823, usage_txt + 870, usage_txt + 876, usage_txt + 979,
- usage_txt + 991, usage_txt +1042, usage_txt +1093, usage_txt +1127,
- usage_txt +1233, usage_txt +1239, usage_txt +1245, usage_txt +1252,
- usage_txt +1263, usage_txt +1289, usage_txt +1310, usage_txt +1318,
- usage_txt +1369, usage_txt +1376, usage_txt +1383, usage_txt +1388,
- usage_txt +1394, usage_txt +1403, usage_txt +1411, usage_txt +1418,
- usage_txt +1425, usage_txt +1430, usage_txt +1438, usage_txt +1442,
- usage_txt +1476, usage_txt +1514, usage_txt +1579, usage_txt +1622,
- usage_txt +1657, usage_txt +1698, usage_txt +1738, usage_txt +1765,
- usage_txt +1832, usage_txt +1880, usage_txt +1913, usage_txt +1938,
- usage_txt +1973, usage_txt +2011, usage_txt +2038, usage_txt +2087,
- usage_txt +2092, usage_txt +2110, usage_txt +2154, usage_txt +2208,
- usage_txt +2254, usage_txt +2262, usage_txt +2310, usage_txt +2312,
- usage_txt +2337, usage_txt +2371, usage_txt +2390, usage_txt +2424,
- usage_txt +2460, usage_txt +2498, usage_txt +2554, usage_txt +2562,
- usage_txt +2588, usage_txt +2654, usage_txt +2696, usage_txt +2710,
- usage_txt +2735, usage_txt +2775, usage_txt +2818, usage_txt +2822,
- usage_txt +2831, usage_txt +3050, usage_txt +3053, usage_txt +3060,
- usage_txt +3064, usage_txt +3072, usage_txt +3076, usage_txt +3080,
- usage_txt +3084, usage_txt +3088, usage_txt +3092, usage_txt +3096,
- usage_txt +3100, usage_txt +3104, usage_txt +3111, usage_txt +3123,
- usage_txt +3131, usage_txt +3135, usage_txt +3138, usage_txt +3171
+ usage_txt + 247, usage_txt + 338, usage_txt + 397, usage_txt + 401,
+ usage_txt + 428, usage_txt + 477, usage_txt + 505, usage_txt + 542,
+ usage_txt + 567, usage_txt + 593, usage_txt + 633, usage_txt + 770,
+ usage_txt + 818, usage_txt + 872, usage_txt + 914, usage_txt + 938,
+ usage_txt + 964, usage_txt + 977, usage_txt + 991, usage_txt +1038,
+ usage_txt +1044, usage_txt +1147, usage_txt +1159, usage_txt +1210,
+ usage_txt +1261, usage_txt +1295, usage_txt +1336, usage_txt +1359,
+ usage_txt +1385, usage_txt +1416, usage_txt +1430, usage_txt +1445,
+ usage_txt +1476, usage_txt +1503, usage_txt +1609, usage_txt +1615,
+ usage_txt +1621, usage_txt +1628, usage_txt +1639, usage_txt +1665,
+ usage_txt +1691, usage_txt +1699, usage_txt +1735, usage_txt +1786,
+ usage_txt +1842, usage_txt +1876, usage_txt +1914, usage_txt +1979,
+ usage_txt +2022, usage_txt +2057, usage_txt +2098, usage_txt +2138,
+ usage_txt +2165, usage_txt +2232, usage_txt +2280, usage_txt +2313,
+ usage_txt +2338, usage_txt +2386, usage_txt +2421, usage_txt +2459,
+ usage_txt +2486, usage_txt +2535, usage_txt +2540, usage_txt +2558,
+ usage_txt +2593, usage_txt +2637, usage_txt +2691, usage_txt +2737,
+ usage_txt +2745, usage_txt +2793, usage_txt +2795, usage_txt +2820,
+ usage_txt +2854, usage_txt +2873, usage_txt +2907, usage_txt +2943,
+ usage_txt +2981, usage_txt +3037, usage_txt +3045, usage_txt +3071,
+ usage_txt +3137, usage_txt +3150, usage_txt +3181, usage_txt +3218,
+ usage_txt +3264, usage_txt +3280, usage_txt +3286, usage_txt +3338,
+ usage_txt +3352, usage_txt +3398, usage_txt +3426, usage_txt +3471,
+ usage_txt +3513, usage_txt +3527, usage_txt +3552, usage_txt +3592,
+ usage_txt +3635, usage_txt +3639, usage_txt +3858, usage_txt +3861,
+ usage_txt +3868, usage_txt +3872, usage_txt +3880, usage_txt +3884,
+ usage_txt +3888, usage_txt +3892, usage_txt +3896, usage_txt +3900,
+ usage_txt +3904, usage_txt +3908, usage_txt +3912, usage_txt +3916,
+ usage_txt +3920, usage_txt +3927, usage_txt +3939, usage_txt +3947,
+ usage_txt +3951, usage_txt +3954, usage_txt +3987
}
};
/*
- * $Id: boolean.c,v 4.10 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2007-01-13 10:10:39 bkorb"
+ * $Id: boolean.c,v 4.16 2009/01/01 16:51:47 bkorb Exp $
+ * Time-stamp: "2008-08-03 13:06:02 bkorb"
*
* Automated Options Paged Usage module.
*
* This routine will run run-on options through a pager so the
* user may examine, print or edit them at their leisure.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
*
- * Automated Options 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.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * These files have the following md5sums:
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
/*=export_func optionBooleanVal
char* pz;
ag_bool res = AG_TRUE;
+ if ((pOD->fOptState & OPTST_RESET) != 0)
+ return;
+
+ if (pOD->optArg.argString == NULL) {
+ pOD->optArg.argBool = AG_FALSE;
+ return;
+ }
+
switch (*(pOD->optArg.argString)) {
case '0':
{
/* -*- Mode: C -*- */
-/* --- fake the preprocessor into handlng portability */
-/*
- * Time-stamp: "2007-02-03 17:41:06 bkorb"
+/* compat.h --- fake the preprocessor into handlng portability
+ *
+ * Time-stamp: "2008-06-14 09:36:25 bkorb"
+ *
+ * $Id: compat.h,v 4.21 2009/01/01 16:51:52 bkorb Exp $
+ *
+ * compat.h is free software.
+ * This file is part of AutoGen.
+ *
+ * AutoGen copyright (c) 1992-2009 by Bruce Korb - all rights reserved
+ *
+ * AutoGen 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.
+ *
+ * AutoGen 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.
*
- * Author: Gary V Vaughan <gvaughan@oranda.demon.co.uk>
- * Created: Mon Jun 30 15:54:46 1997
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
*
- * $Id: compat.h,v 4.16 2007/04/27 01:10:47 bkorb Exp $
+ * As a special exception, Bruce Korb gives permission for additional
+ * uses of the text contained in the release of compat.h.
+ *
+ * The exception is that, if you link the compat.h library with other
+ * files to produce an executable, this does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * Your use of that executable is in no way restricted on account of
+ * linking the compat.h library code into it.
+ *
+ * This exception does not however invalidate any other reasons why
+ * the executable file might be covered by the GNU General Public License.
+ *
+ * This exception applies only to the code released by Bruce Korb under
+ * the name compat.h. If you copy code from other sources under the
+ * General Public License into a copy of compat.h, as the General Public
+ * License permits, the exception does not apply to the code that you add
+ * in this way. To avoid misleading anyone as to the status of such
+ * modified files, you must delete this exception notice from them.
+ *
+ * If you write modifications of your own for compat.h, it is your choice
+ * whether to permit this exception to apply to your modifications.
+ * If you do not wish that, delete this exception notice.
*/
#ifndef COMPAT_H_GUARD
#define COMPAT_H_GUARD 1
#ifndef HAVE_UINTPTR_T
typedef unsigned long uintptr_t;
#endif
+#ifndef HAVE_SIZE_T
+ typedef unsigned int size_t;
+#endif
+#ifndef HAVE_WINT_T
+ typedef unsigned int wint_t;
+#endif
+#ifndef HAVE_PID_T
+ typedef signed int pid_t;
+#endif
/* redefine these for BSD style string libraries */
#ifndef HAVE_STRCHR
/*
* Author: Gary V Vaughan <gvaughan@oranda.demon.co.uk>
* Time-stamp: "2006-09-23 19:46:16 bkorb"
- * Created: Tue Jun 24 15:07:31 1997
- * Last Modified: $Date: 2006/11/27 01:52:23 $
+ * Last Modified: $Date: 2007/07/04 20:51:18 $
* by: bkorb
*
- * $Id: pathfind.c,v 4.10 2006/11/27 01:52:23 bkorb Exp $
+ * $Id: pathfind.c,v 4.11 2007/07/04 20:51:18 bkorb Exp $
*/
/* Code: */
/*
- * Time-stamp: "2006-10-14 14:55:09 bkorb"
+ * Time-stamp: "2007-07-04 09:45:44 bkorb"
* by: bkorb
- * Last Committed: $Date: 2007/04/28 22:19:23 $
+ * Last Committed: $Date: 2007/07/04 20:51:18 $
+ *
+ * This file is part of AutoGen.
+ *
+ * AutoGen copyright (c) 1992-2007 Bruce Korb - all rights reserved
+ *
+ * AutoGen 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.
+ *
+ * AutoGen 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 <http://www.gnu.org/licenses/>.
*/
#ifndef WINDOWS_CONFIG_HACKERY
#define WINDOWS_CONFIG_HACKERY 1
/*
- * $Id: configfile.c,v 1.21 2007/04/15 19:01:18 bkorb Exp $
- * Time-stamp: "2007-04-15 11:22:46 bkorb"
+ * $Id: configfile.c,v 1.35 2009/01/18 22:48:51 bkorb Exp $
+ * Time-stamp: "2009-01-18 10:21:58 bkorb"
*
* configuration/rc/ini file handling.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
*
- * Automated Options 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.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * These files have the following md5sums:
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static void
filePreset(
tOptions* pOpts,
char* pzText,
tOptionValue* pType );
-static char*
-parseLoadMode(
- char* pzText,
- tOptionLoadMode* pMode );
-
static char*
parseSetMemType(
tOptions* pOpts,
int direction )
{
tmap_info_t cfgfile;
- tOptState st = OPTSTATE_INITIALIZER(PRESET);
+ tOptState optst = OPTSTATE_INITIALIZER(PRESET);
char* pzFileText =
text_mmap( pzFileName, PROT_READ|PROT_WRITE, MAP_PRIVATE, &cfgfile );
return;
if (direction == DIRECTION_CALLED) {
- st.flags = OPTST_DEFINED;
- direction = DIRECTION_PROCESS;
+ optst.flags = OPTST_DEFINED;
+ direction = DIRECTION_PROCESS;
}
/*
* and we consider stuff set herein to be "set" by the client program.
*/
if ((pOpts->fOptSet & OPTPROC_PRESETTING) == 0)
- st.flags = OPTST_SET;
+ optst.flags = OPTST_SET;
do {
- while (isspace( (int)*pzFileText )) pzFileText++;
+ while (IS_WHITESPACE_CHAR(*pzFileText)) pzFileText++;
- if (isalpha( (int)*pzFileText )) {
- pzFileText = handleConfig( pOpts, &st, pzFileText, direction );
+ if (IS_VAR_FIRST_CHAR(*pzFileText)) {
+ pzFileText = handleConfig(pOpts, &optst, pzFileText, direction);
} else switch (*pzFileText) {
case '<':
- if (isalpha( (int)pzFileText[1] ))
- pzFileText = handleStructure(pOpts, &st, pzFileText, direction);
+ if (IS_VAR_FIRST_CHAR(pzFileText[1]))
+ pzFileText =
+ handleStructure(pOpts, &optst, pzFileText, direction);
else switch (pzFileText[1]) {
case '?':
if (pzEnd == NULL)
return pzText + strlen(pzText);
- while (ISNAMECHAR( (int)*pzText )) pzText++;
- while (isspace( (int)*pzText )) pzText++;
+ while (IS_VALUE_NAME_CHAR(*pzText)) pzText++;
+ while (IS_WHITESPACE_CHAR(*pzText)) pzText++;
if (pzText > pzEnd) {
name_only:
*pzEnd++ = NUL;
* is an invalid format and we give up parsing the text.
*/
if ((*pzText == '=') || (*pzText == ':')) {
- while (isspace( (int)*++pzText )) ;
+ while (IS_WHITESPACE_CHAR(*++pzText)) ;
if (pzText > pzEnd)
goto name_only;
- } else if (! isspace((int)pzText[-1]))
+ } else if (! IS_WHITESPACE_CHAR(pzText[-1]))
return NULL;
/*
size_t name_len;
if ( (strncmp( pzText+2, zProg, title_len ) != 0)
- || (! isspace( (int)pzText[title_len+2] )) ) {
+ || (! IS_WHITESPACE_CHAR(pzText[title_len+2])) ) {
pzText = strchr( pzText+2, '>' );
if (pzText != NULL)
pzText++;
do {
pzText += title_len;
- if (isspace((int)*pzText)) {
- while (isspace((int)*pzText)) pzText++;
+ if (IS_WHITESPACE_CHAR(*pzText)) {
+ while (IS_WHITESPACE_CHAR(*++pzText)) ;
if ( (strneqvcmp( pzText, pOpts->pzProgName, (int)name_len) == 0)
&& (pzText[name_len] == '>')) {
pzText += name_len + 1;
int direction )
{
tOptionLoadMode mode = option_load_mode;
- tOptionValue valu;
+ tOptionValue valu;
char* pzName = ++pzText;
char* pzData;
char* pcNulPoint;
- while (ISNAMECHAR( *pzText )) pzText++;
+ while (IS_VALUE_NAME_CHAR(*pzText)) pzText++;
pcNulPoint = pzText;
valu.valType = OPARG_TYPE_STRING;
*/
memset(pcNulPoint, ' ', pzData - pcNulPoint);
+ /*
+ * If we are getting a "string" value, the process the XML-ish
+ * %XX hex characters.
+ */
+ if (valu.valType == OPARG_TYPE_STRING) {
+ char * pzSrc = pzData;
+ char * pzDst = pzData;
+ char bf[4];
+ bf[2] = NUL;
+
+ for (;;) {
+ int ch = ((int)*(pzSrc++)) & 0xFF;
+ switch (ch) {
+ case NUL: goto string_fixup_done;
+
+ case '%':
+ bf[0] = *(pzSrc++);
+ bf[1] = *(pzSrc++);
+ if ((bf[0] == NUL) || (bf[1] == NUL))
+ goto string_fixup_done;
+ ch = strtoul(bf, NULL, 16);
+ /* FALLTHROUGH */
+
+ default:
+ *(pzDst++) = ch;
+ }
+ } string_fixup_done:;
+ *pzDst = NUL;
+ }
+
/*
* "pzName" points to what looks like text for one option/configurable.
* It is NUL terminated. Process it.
LOCAL void
internalFileLoad( tOptions* pOpts )
{
- int idx;
- int inc = DIRECTION_PRESET;
- char zFileName[ AG_PATH_MAX+1 ];
+ uint32_t svfl;
+ int idx;
+ int inc;
+ char zFileName[ AG_PATH_MAX+1 ];
if (pOpts->papzHomeList == NULL)
return;
+ svfl = pOpts->fOptSet;
+ inc = DIRECTION_PRESET;
+
+ /*
+ * Never stop on errors in config files.
+ */
+ pOpts->fOptSet &= ~OPTPROC_ERRSTOP;
+
/*
* Find the last RC entry (highest priority entry)
*/
}
}
} /* twice for every path in the home list, ... */
+
+ pOpts->fOptSet = svfl;
}
void
optionLoadOpt( tOptions* pOpts, tOptDesc* pOptDesc )
{
+ struct stat sb;
+
/*
* IF the option is not being disabled, THEN load the file. There must
* be a file. (If it is being disabled, then the disablement processing
* already took place. It must be done to suppress preloading of ini/rc
* files.)
*/
- if (! DISABLED_OPT( pOptDesc )) {
- struct stat sb;
- if (stat( pOptDesc->optArg.argString, &sb ) != 0) {
- if ((pOpts->fOptSet & OPTPROC_ERRSTOP) == 0)
- return;
-
- fprintf( stderr, zFSErrOptLoad, errno, strerror( errno ),
- pOptDesc->optArg.argString );
- exit(EX_NOINPUT);
- /* NOT REACHED */
- }
+ if ( DISABLED_OPT(pOptDesc)
+ || ((pOptDesc->fOptState & OPTST_RESET) != 0))
+ return;
- if (! S_ISREG( sb.st_mode )) {
- if ((pOpts->fOptSet & OPTPROC_ERRSTOP) == 0)
- return;
+ if (stat( pOptDesc->optArg.argString, &sb ) != 0) {
+ if ((pOpts->fOptSet & OPTPROC_ERRSTOP) == 0)
+ return;
- fprintf( stderr, zNotFile, pOptDesc->optArg.argString );
- exit(EX_NOINPUT);
- /* NOT REACHED */
- }
+ fprintf( stderr, zFSErrOptLoad, errno, strerror( errno ),
+ pOptDesc->optArg.argString );
+ exit(EX_NOINPUT);
+ /* NOT REACHED */
+ }
- filePreset(pOpts, pOptDesc->optArg.argString, DIRECTION_CALLED);
+ if (! S_ISREG( sb.st_mode )) {
+ if ((pOpts->fOptSet & OPTPROC_ERRSTOP) == 0)
+ return;
+
+ fprintf( stderr, zNotFile, pOptDesc->optArg.argString );
+ exit(EX_NOINPUT);
+ /* NOT REACHED */
}
+
+ filePreset(pOpts, pOptDesc->optArg.argString, DIRECTION_CALLED);
}
tOptionLoadMode* pMode,
tOptionValue* pType )
{
- size_t lenLoadType = strlen( zLoadType );
- size_t lenKeyWords = strlen( zKeyWords );
- size_t lenSetMem = strlen( zSetMembers );
+ size_t len;
do {
- switch (*pzText) {
- case '/': pType->valType = OPARG_TYPE_NONE;
- case '>': return pzText;
+ if (! IS_WHITESPACE_CHAR(*pzText))
+ switch (*pzText) {
+ case '/': pType->valType = OPARG_TYPE_NONE;
+ case '>': return pzText;
- default:
- case NUL: return NULL;
-
- case ' ':
- case '\t':
- case '\n':
- case '\f':
- case '\r':
- case '\v':
+ default:
+ case NUL: return NULL;
+ }
+
+ while (IS_WHITESPACE_CHAR(*++pzText)) ;
+ len = 0;
+ while (IS_LOWER_CASE_CHAR(pzText[len])) len++;
+
+ switch (find_xat_attribute_id(pzText, len)) {
+ case XAT_KWD_TYPE:
+ pzText = parseValueType( pzText+len, pType );
break;
- }
- while (isspace( (int)*++pzText )) ;
+ case XAT_KWD_WORDS:
+ pzText = parseKeyWordType( pOpts, pzText+len, pType );
+ break;
- if (strncmp( pzText, zLoadType, lenLoadType ) == 0) {
- pzText = parseValueType( pzText+lenLoadType, pType );
- continue;
- }
+ case XAT_KWD_MEMBERS:
+ pzText = parseSetMemType( pOpts, pzText+len, pType );
+ break;
- if (strncmp( pzText, zKeyWords, lenKeyWords ) == 0) {
- pzText = parseKeyWordType( pOpts, pzText+lenKeyWords, pType );
- continue;
- }
+ case XAT_KWD_COOKED:
+ pzText += len;
+ if (! IS_END_XML_TOKEN_CHAR(*pzText))
+ goto invalid_kwd;
- if (strncmp( pzText, zSetMembers, lenSetMem ) == 0) {
- pzText = parseSetMemType( pOpts, pzText+lenSetMem, pType );
- continue;
- }
+ *pMode = OPTION_LOAD_COOKED;
+ break;
+
+ case XAT_KWD_UNCOOKED:
+ pzText += len;
+ if (! IS_END_XML_TOKEN_CHAR(*pzText))
+ goto invalid_kwd;
+
+ *pMode = OPTION_LOAD_UNCOOKED;
+ break;
+
+ case XAT_KWD_KEEP:
+ pzText += len;
+ if (! IS_END_XML_TOKEN_CHAR(*pzText))
+ goto invalid_kwd;
+
+ *pMode = OPTION_LOAD_KEEP;
+ break;
- pzText = parseLoadMode( pzText, pMode );
+ default:
+ case XAT_KWD_INVALID:
+ invalid_kwd:
+ pType->valType = OPARG_TYPE_NONE;
+ return skipUnknown( pzText );
+ }
} while (pzText != NULL);
return pzText;
}
-/* parseLoadMode
- *
- * "pzText" points to some name character. We check for "cooked" or
- * "uncooked" or "keep". This function should handle any attribute
- * that does not have an associated value.
- */
-static char*
-parseLoadMode(
- char* pzText,
- tOptionLoadMode* pMode )
-{
- {
- size_t len = strlen(zLoadCooked);
- if (strncmp( pzText, zLoadCooked, len ) == 0) {
- if ( (pzText[len] == '>')
- || (pzText[len] == '/')
- || isspace((int)pzText[len])) {
- *pMode = OPTION_LOAD_COOKED;
- return pzText + len;
- }
- goto unknown;
- }
- }
-
- {
- size_t len = strlen(zLoadUncooked);
- if (strncmp( pzText, zLoadUncooked, len ) == 0) {
- if ( (pzText[len] == '>')
- || (pzText[len] == '/')
- || isspace((int)pzText[len])) {
- *pMode = OPTION_LOAD_UNCOOKED;
- return pzText + len;
- }
- goto unknown;
- }
- }
-
- {
- size_t len = strlen(zLoadKeep);
- if (strncmp( pzText, zLoadKeep, len ) == 0) {
- if ( (pzText[len] == '>')
- || (pzText[len] == '/')
- || isspace((int)pzText[len])) {
- *pMode = OPTION_LOAD_KEEP;
- return pzText + len;
- }
- goto unknown;
- }
- }
-
- unknown:
- return skipUnknown( pzText );
-}
-
-
/* parseSetMemType
*
* "pzText" points to the character after "members="
char* pzText,
tOptionValue* pType )
{
- {
- size_t len = strlen(zLtypeString);
- if (strncmp( pzText, zLtypeString, len ) == 0) {
- if ((pzText[len] == '>') || isspace((int)pzText[len])) {
- pType->valType = OPARG_TYPE_STRING;
- return pzText + len;
- }
- goto unknown;
- }
- }
+ size_t len = 0;
- {
- size_t len = strlen(zLtypeInteger);
- if (strncmp( pzText, zLtypeInteger, len ) == 0) {
- if ((pzText[len] == '>') || isspace((int)pzText[len])) {
- pType->valType = OPARG_TYPE_NUMERIC;
- return pzText + len;
- }
- goto unknown;
- }
- }
+ if (*(pzText++) != '=')
+ goto woops;
- {
- size_t len = strlen(zLtypeBool);
- if (strncmp( pzText, zLtypeBool, len ) == 0) {
- if ((pzText[len] == '>') || isspace(pzText[len])) {
- pType->valType = OPARG_TYPE_BOOLEAN;
- return pzText + len;
- }
- goto unknown;
- }
- }
+ while (IS_OPTION_NAME_CHAR(pzText[len])) len++;
+ pzText += len;
- {
- size_t len = strlen(zLtypeKeyword);
- if (strncmp( pzText, zLtypeKeyword, len ) == 0) {
- if ((pzText[len] == '>') || isspace((int)pzText[len])) {
- pType->valType = OPARG_TYPE_ENUMERATION;
- return pzText + len;
- }
- goto unknown;
- }
+ if ((len == 0) || (! IS_END_XML_TOKEN_CHAR(*pzText))) {
+ woops:
+ pType->valType = OPARG_TYPE_NONE;
+ return skipUnknown( pzText );
}
- {
- size_t len = strlen(zLtypeSetMembership);
- if (strncmp( pzText, zLtypeSetMembership, len ) == 0) {
- if ((pzText[len] == '>') || isspace((int)pzText[len])) {
- pType->valType = OPARG_TYPE_MEMBERSHIP;
- return pzText + len;
- }
- goto unknown;
- }
- }
+ switch (find_value_type_id(pzText - len, len)) {
+ default:
+ case VTP_KWD_INVALID: goto woops;
- {
- size_t len = strlen(zLtypeNest);
- if (strncmp( pzText, zLtypeNest, len ) == 0) {
- if ((pzText[len] == '>') || isspace((int)pzText[len])) {
- pType->valType = OPARG_TYPE_HIERARCHY;
- return pzText + len;
- }
- goto unknown;
- }
+ case VTP_KWD_STRING:
+ pType->valType = OPARG_TYPE_STRING;
+ break;
+
+ case VTP_KWD_INTEGER:
+ pType->valType = OPARG_TYPE_NUMERIC;
+ break;
+
+ case VTP_KWD_BOOL:
+ case VTP_KWD_BOOLEAN:
+ pType->valType = OPARG_TYPE_BOOLEAN;
+ break;
+
+ case VTP_KWD_KEYWORD:
+ pType->valType = OPARG_TYPE_ENUMERATION;
+ break;
+
+ case VTP_KWD_SET:
+ case VTP_KWD_SET_MEMBERSHIP:
+ pType->valType = OPARG_TYPE_MEMBERSHIP;
+ break;
+
+ case VTP_KWD_NESTED:
+ case VTP_KWD_HIERARCHY:
+ pType->valType = OPARG_TYPE_HIERARCHY;
}
- unknown:
- pType->valType = OPARG_TYPE_NONE;
- return skipUnknown( pzText );
+ return pzText;
}
skipUnknown( char* pzText )
{
for (;; pzText++) {
- if (isspace( (int)*pzText )) return pzText;
- switch (*pzText) {
- case NUL: return NULL;
- case '/':
- case '>': return pzText;
- }
+ if (IS_END_XML_TOKEN_CHAR(*pzText)) return pzText;
+ if (*pzText == NUL) return NULL;
}
}
* is available, then go do it.
*/
if ( ((pOpts->fOptSet & OPTPROC_TRANSLATE) != 0)
- && (pOpts->pTransProc != 0) ) {
+ && (pOpts->pTransProc != NULL) ) {
+ /*
+ * If option names are not to be translated at all, then do not do
+ * it for configuration parsing either. (That is the bit that really
+ * gets tested anyway.)
+ */
+ if ((pOpts->fOptSet & OPTPROC_NO_XLAT_MASK) == OPTPROC_NXLAT_OPT)
+ pOpts->fOptSet |= OPTPROC_NXLAT_OPT_CFG;
(*pOpts->pTransProc)();
pOpts->fOptSet &= ~OPTPROC_TRANSLATE;
}
|| (pOpts->structVersion < OPTIONS_MINIMUM_VERSION )
) ) {
- fprintf( stderr, zAO_Err, pOpts->origArgVect[0],
- NUM_TO_VER( pOpts->structVersion ));
+ fprintf(stderr, zAO_Err, pzProgram, NUM_TO_VER(pOpts->structVersion));
if (pOpts->structVersion > OPTIONS_STRUCT_VERSION )
fputs( zAO_Big, stderr );
else
-
/*
- * $Id: cook.c,v 4.10 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2006-09-24 15:21:02 bkorb"
+ * $Id: cook.c,v 4.17 2009/01/01 16:51:47 bkorb Exp $
+ * Time-stamp: "2007-11-16 22:49:11 bkorb"
*
* This file contains the routines that deal with processing quoted strings
* into an internal format.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
*
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * Automated Options 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.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * These files have the following md5sums:
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
- *
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
/* = = = END-STATIC-FORWARD = = = */
/*=export_func ao_string_cook_escape_char
case 't': *pRes = '\t'; break;
case 'v': *pRes = '\v'; break;
- case 'x': /* HEX Escape */
- if (isxdigit( (int)*pzIn )) {
- unsigned int val;
- unsigned char ch = *pzIn++;
-
- if ((ch >= 'A') && (ch <= 'F'))
- val = 10 + (ch - 'A');
- else if ((ch >= 'a') && (ch <= 'f'))
- val = 10 + (ch - 'a');
- else val = ch - '0';
-
- ch = *pzIn;
+ case 'x':
+ case 'X': /* HEX Escape */
+ if (IS_HEX_DIGIT_CHAR(*pzIn)) {
+ char z[4], *pz = z;
- if (! isxdigit( ch )) {
- *pRes = val;
- res = 2;
- break;
- }
- val <<= 4;
- if ((ch >= 'A') && (ch <= 'F'))
- val += 10 + (ch - 'A');
- else if ((ch >= 'a') && (ch <= 'f'))
- val += 10 + (ch - 'a');
- else val += ch - '0';
-
- res = 3;
- *pRes = val;
+ do *(pz++) = *(pzIn++);
+ while (IS_HEX_DIGIT_CHAR(*pzIn) && (pz < z + 2));
+ *pz = NUL;
+ *pRes = (unsigned char)strtoul(z, NULL, 16);
+ res += pz - z;
}
break;
- default:
+ case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7':
+ {
/*
* IF the character copied was an octal digit,
* THEN set the output character to an octal value
*/
- if (isdigit( (int)*pRes ) && (*pRes < '8')) {
- unsigned int val = *pRes - '0';
- unsigned char ch = *pzIn++;
-
- /*
- * IF the second character is *not* an octal digit,
- * THEN save the value and bail
- */
- if ((ch < '0') || (ch > '7')) {
- *pRes = val;
- break;
- }
-
- val = (val<<3) + (ch - '0');
- ch = *pzIn;
- res = 2;
-
- /*
- * IF the THIRD character is *not* an octal digit,
- * THEN save the value and bail
- */
- if ((ch < '0') || (ch > '7')) {
- *pRes = val;
- break;
- }
-
- /*
- * IF the new value would not be too large,
- * THEN add on the third and last character value
- */
- if ((val<<3) < 0xFF) {
- val = (val<<3) + (ch - '0');
- res = 3;
- }
+ char z[4], *pz = z + 1;
+ unsigned long val;
+ z[0] = *pRes;
+
+ while (IS_OCT_DIGIT_CHAR(*pzIn) && (pz < z + 3))
+ *(pz++) = *(pzIn++);
+ *pz = NUL;
+ val = strtoul(z, NULL, 8);
+ if (val > 0xFF)
+ val = 0xFF;
+ *pRes = (unsigned char)val;
+ res = pz - z;
+ break;
+ }
- *pRes = val;
- break;
- }
+ default: ;
}
return res;
pzS++;
scan_for_quote:
- while (isspace((int)*pzS))
+ while (IS_WHITESPACE_CHAR(*pzS))
if (*(pzS++) == '\n')
(*pLineCt)++;
/*
- * $Id: enumeration.c,v 4.17 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2007-01-13 10:22:35 bkorb"
+ * $Id: enumeration.c,v 4.25 2009/01/01 16:51:47 bkorb Exp $
+ * Time-stamp: "2008-07-27 12:28:01 bkorb"
*
* Automated Options Paged Usage module.
*
* This routine will run run-on options through a pager so the
* user may examine, print or edit them at their leisure.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
+ * These files have the following md5sums:
*
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
tSCC* pz_enum_err_fmt;
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static void
enumError(
tOptions* pOpts,
{
size_t max_len = 0;
size_t ttl_len = 0;
+ int ct_down = name_ct;
+ int hidden = 0;
- if (pOpts != NULL)
- fprintf( option_usage_fp, pz_enum_err_fmt, pOpts->pzProgName,
- pOD->optArg.argString, pOD->pz_Name );
+ /*
+ * A real "pOpts" pointer means someone messed up. Give a real error.
+ */
+ if (pOpts > OPTPROC_EMIT_LIMIT)
+ fprintf(option_usage_fp, pz_enum_err_fmt, pOpts->pzProgName,
+ pOD->optArg.argString, pOD->pz_Name);
- fprintf( option_usage_fp, zValidKeys, pOD->pz_Name );
+ fprintf(option_usage_fp, zValidKeys, pOD->pz_Name);
+ /*
+ * If the first name starts with this funny character, then we have
+ * a first value with an unspellable name. You cannot specify it.
+ * So, we don't list it either.
+ */
if (**paz_names == 0x7F) {
paz_names++;
- name_ct--;
+ hidden = 1;
+ ct_down = --name_ct;
}
/*
*/
{
tCC * const * paz = paz_names;
- int ct = name_ct;
do {
size_t len = strlen( *(paz++) ) + 1;
if (len > max_len)
max_len = len;
ttl_len += len;
- } while (--ct > 0);
+ } while (--ct_down > 0);
+
+ ct_down = name_ct;
}
/*
if (max_len > 35) {
do {
fprintf( option_usage_fp, " %s\n", *(paz_names++) );
- } while (--name_ct > 0);
+ } while (--ct_down > 0);
}
/*
do {
fputc( ' ', option_usage_fp );
fputs( *(paz_names++), option_usage_fp );
- } while (--name_ct > 0);
+ } while (--ct_down > 0);
fputc( '\n', option_usage_fp );
}
/*
* Loop through all but the last entry
*/
- while (--name_ct > 0) {
+ ct_down = name_ct;
+ while (--ct_down > 0) {
if (++ent_no == max_len) {
/*
* Last entry on a line. Start next line, too.
}
else
- fprintf( option_usage_fp, zFmt, *(paz_names++) );
+ fprintf(option_usage_fp, zFmt, *(paz_names++) );
}
- fprintf( option_usage_fp, "%s\n", *paz_names );
+ fprintf(option_usage_fp, "%s\n", *paz_names);
}
- /*
- * IF we do not have a pOpts pointer, then this output is being requested
- * by the usage procedure. Let's not re-invoke it recursively.
- */
- if (pOpts != NULL)
+ if (pOpts > OPTPROC_EMIT_LIMIT) {
+ fprintf(option_usage_fp, zIntRange, hidden, name_ct - 1 + hidden);
+
(*(pOpts->pUsageProc))( pOpts, EXIT_FAILURE );
- if (OPTST_GET_ARGTYPE(pOD->fOptState) == OPARG_TYPE_MEMBERSHIP)
- fputs( zSetMemberSettings, option_usage_fp );
+ /* NOTREACHED */
+ }
+
+
+ if (OPTST_GET_ARGTYPE(pOD->fOptState) == OPARG_TYPE_MEMBERSHIP) {
+ fprintf(option_usage_fp, zLowerBits, name_ct);
+ fputs(zSetMemberSettings, option_usage_fp);
+ } else {
+ fprintf(option_usage_fp, zIntRange, hidden, name_ct - 1 + hidden);
+ }
}
tCC* const * paz_names,
unsigned int name_ct )
{
+ /*
+ * Return the matching index as a pointer sized integer.
+ * The result gets stashed in a char* pointer.
+ */
uintptr_t res = name_ct;
size_t len = strlen( (char*)pzName );
uintptr_t idx;
+
+ if (IS_DEC_DIGIT_CHAR(*pzName)) {
+ char * pz = (char *)(void *)pzName;
+ unsigned long val = strtoul(pz, &pz, 0);
+ if ((*pz == NUL) && (val < name_ct))
+ return (uintptr_t)val;
+ enumError(pOpts, pOD, paz_names, (int)name_ct);
+ return name_ct;
+ }
+
/*
* Look for an exact match, but remember any partial matches.
* Multiple partial matches means we have an ambiguous match.
if (paz_names[idx][len] == NUL)
return idx; /* full match */
- if (res != name_ct) {
- pz_enum_err_fmt = zAmbigKey;
- option_usage_fp = stderr;
- enumError( pOpts, pOD, paz_names, (int)name_ct );
- }
- res = idx; /* save partial match */
+ res = (res != name_ct) ? ~0 : idx; /* save partial match */
}
}
- /*
- * no partial match -> error
- */
- if (res == name_ct) {
- pz_enum_err_fmt = zNoKey;
- option_usage_fp = stderr;
- enumError( pOpts, pOD, paz_names, (int)name_ct );
- }
+ if (res < name_ct)
+ return res; /* partial match */
- /*
- * Return the matching index as a char* pointer.
- * The result gets stashed in a char* pointer, so it will have to fit.
- */
- return res;
+ pz_enum_err_fmt = (res == name_ct) ? zNoKey : zAmbigKey;
+ option_usage_fp = stderr;
+ enumError(pOpts, pOD, paz_names, (int)name_ct);
+ return name_ct;
}
tOptDesc od;
od.optArg.argEnum = enum_val;
- (*(pOD->pOptProc))( (void*)(2UL), &od );
+ (*(pOD->pOptProc))(OPTPROC_RETURN_VALNAME, &od );
return od.optArg.argString;
}
* then it is some sort of special request.
*/
switch ((uintptr_t)pOpts) {
- case 0UL:
+ case (uintptr_t)OPTPROC_EMIT_USAGE:
/*
* print the list of enumeration names.
*/
- enumError( pOpts, pOD, paz_names, (int)name_ct );
+ enumError(pOpts, pOD, paz_names, (int)name_ct);
break;
- case 1UL:
+ case (uintptr_t)OPTPROC_EMIT_SHELL:
{
unsigned int ix = pOD->optArg.argEnum;
/*
break;
}
- case 2UL:
+ case (uintptr_t)OPTPROC_RETURN_VALNAME:
{
tSCC zInval[] = "*INVALID*";
unsigned int ix = pOD->optArg.argEnum;
if (ix >= name_ct)
return (uintptr_t)zInval;
- res = (uintptr_t)paz_names[ ix ];
+ pOD->optArg.argString = paz_names[ix];
break;
}
default:
- res = findName( pOD->optArg.argString, pOpts, pOD, paz_names, name_ct );
+ res = findName(pOD->optArg.argString, pOpts, pOD, paz_names, name_ct);
if (pOD->fOptState & OPTST_ALLOC_ARG) {
AGFREE(pOD->optArg.argString);
* then it is some sort of special request.
*/
switch ((uintptr_t)pOpts) {
- case 0UL:
+ case (uintptr_t)OPTPROC_EMIT_USAGE:
/*
* print the list of enumeration names.
*/
- enumError( pOpts, pOD, paz_names, (int)name_ct );
+ enumError(OPTPROC_EMIT_USAGE, pOD, paz_names, (int)name_ct );
return;
- case 1UL:
+ case (uintptr_t)OPTPROC_EMIT_SHELL:
{
/*
* print the name string.
*/
+ int ix = 0;
uintptr_t bits = (uintptr_t)pOD->optCookie;
- uintptr_t res = 0;
size_t len = 0;
+ bits &= ((uintptr_t)1 << (uintptr_t)name_ct) - (uintptr_t)1;
+
while (bits != 0) {
if (bits & 1) {
if (len++ > 0) fputs( " | ", stdout );
- fputs( paz_names[ res ], stdout );
+ fputs(paz_names[ix], stdout);
}
- if (++res >= name_ct) break;
+ if (++ix >= name_ct) break;
bits >>= 1;
}
return;
}
- case 2UL:
+ case (uintptr_t)OPTPROC_RETURN_VALNAME:
{
char* pz;
uintptr_t bits = (uintptr_t)pOD->optCookie;
- uintptr_t res = 0;
- size_t len = 0;
+ int ix = 0;
+ size_t len = 5;
+
+ bits &= ((uintptr_t)1 << (uintptr_t)name_ct) - (uintptr_t)1;
/*
* Replace the enumeration value with the name string.
*/
while (bits != 0) {
if (bits & 1)
- len += strlen( paz_names[ res ]) + 8;
- if (++res >= name_ct) break;
+ len += strlen( paz_names[ix]) + 8;
+ if (++ix >= name_ct) break;
bits >>= 1;
}
- pOD->optArg.argString = pz = AGALOC( len, "enum name" );
+ pOD->optArg.argString = pz = AGALOC(len, "enum name");
/*
* Start by clearing all the bits. We want to turn off any defaults
strcpy( pz, "none" );
pz += 4;
bits = (uintptr_t)pOD->optCookie;
- res = 0;
+ bits &= ((uintptr_t)1 << (uintptr_t)name_ct) - (uintptr_t)1;
+ ix = 0;
+
while (bits != 0) {
if (bits & 1) {
strcpy( pz, " + " );
- strcpy( pz+3, paz_names[ res ]);
- pz += strlen( paz_names[ res ]) + 3;
+ strcpy( pz+3, paz_names[ix]);
+ pz += strlen( paz_names[ix]) + 3;
}
- if (++res >= name_ct) break;
+ if (++ix >= name_ct) break;
bits >>= 1;
}
return;
break;
}
+ if ((pOD->fOptState & OPTST_RESET) != 0)
+ return;
+
{
tCC* pzArg = pOD->optArg.argString;
uintptr_t res;
if (pz != pzArg + len) {
char z[ AO_NAME_SIZE ];
tCC* p;
+ int shift_ct;
+
if (*pz != NUL) {
if (len >= AO_NAME_LIMIT)
break;
p = pzArg;
}
- bit = 1UL << findName(p, pOpts, pOD, paz_names, name_ct);
+ shift_ct = findName(p, pOpts, pOD, paz_names, name_ct);
+ if (shift_ct >= name_ct) {
+ pOD->optCookie = (void*)0;
+ return;
+ }
+ bit = 1UL << shift_ct;
}
if (iv)
res &= ~bit;
/*
- * $Id: environment.c,v 4.13 2007/04/15 19:01:18 bkorb Exp $
- * Time-stamp: "2007-04-15 11:50:35 bkorb"
+ * $Id: environment.c,v 4.19 2009/01/17 22:08:07 bkorb Exp $
+ * Time-stamp: "2009-01-12 05:52:44 bkorb"
*
* This file contains all of the routines that must be linked into
* an executable to use the generated option processing. The optional
* routines are in separately compiled modules so that they will not
* necessarily be linked in.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
*
- * Automated Options 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.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * These files have the following md5sums:
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static void
checkEnvOpt(tOptState * os, char * env_name,
tOptions* pOpts, teEnvPresetType type);
char** sv_argv;
/*
- * IF there is no such environment variable
- * *or* there is, but we are doing immediate opts and there are
- * no immediate opts to do (--help inside $PROGNAME is silly,
- * but --no-load-defs is not, so that is marked)
- * THEN bail out now. (
+ * No such beast? Then bail now.
*/
- if ( (pczOptStr == NULL)
- || ( (type == ENV_IMM)
- && ((pOpts->fOptSet & OPTPROC_HAS_IMMED) == 0) ) )
+ if (pczOptStr == NULL)
return;
/*
switch (type) {
case ENV_IMM:
- /*
- * We know the OPTPROC_HAS_IMMED bit is set.
- */
(void)doImmediateOpts( pOpts );
break;
- case ENV_NON_IMM:
- (void)doRegularOpts( pOpts );
- break;
+ case ENV_ALL:
+ (void)doImmediateOpts( pOpts );
+ pOpts->curOptIdx = 1;
+ pOpts->pzCurOpt = NULL;
+ /* FALLTHROUGH */
- default:
- /*
- * Only to immediate opts if the OPTPROC_HAS_IMMED bit is set.
- */
- if (pOpts->fOptSet & OPTPROC_HAS_IMMED) {
- (void)doImmediateOpts( pOpts );
- pOpts->curOptIdx = 1;
- pOpts->pzCurOpt = NULL;
- }
+ case ENV_NON_IMM:
(void)doRegularOpts( pOpts );
- break;
}
/*
--- /dev/null
+
+/*
+ * $Id: file.c,v 1.7 2009/01/01 16:51:47 bkorb Exp $
+ * Time-stamp: "2008-12-06 10:15:33 bkorb"
+ *
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
+ *
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
+ *
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
+ *
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
+ *
+ * These files have the following md5sums:
+ *
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
+ */
+
+/*=export_func optionFileCheck
+ * private:
+ *
+ * what: Decipher a boolean value
+ * arg: + tOptions* + pOpts + program options descriptor +
+ * arg: + tOptDesc* + pOptDesc + the descriptor for this arg +
+ * arg: + teOptFileType + ftype + File handling type +
+ * arg: + tuFileMode + mode + file open mode (if needed) +
+ *
+ * doc:
+ * Make sure the named file conforms with the file type mode.
+ * The mode specifies if the file must exist, must not exist or may
+ * (or may not) exist. The mode may also specify opening the
+ * file: don't, open just the descriptor (fd), or open as a stream
+ * (FILE* pointer).
+=*/
+void
+optionFileCheck(tOptions* pOpts, tOptDesc* pOD,
+ teOptFileType ftype, tuFileMode mode)
+{
+ if (pOpts <= OPTPROC_EMIT_LIMIT) {
+ if (pOpts != OPTPROC_EMIT_USAGE)
+ return;
+
+ switch (ftype & FTYPE_MODE_EXIST_MASK) {
+ case FTYPE_MODE_MUST_NOT_EXIST:
+ fputs(zFileCannotExist, option_usage_fp);
+ break;
+
+ case FTYPE_MODE_MUST_EXIST:
+ fputs(zFileMustExist, option_usage_fp);
+ break;
+ }
+ return;
+ }
+
+ if ((pOD->fOptState & OPTST_RESET) != 0) {
+ if (pOD->optCookie != NULL)
+ AGFREE(pOD->optCookie);
+ return;
+ }
+
+ {
+ struct stat sb;
+
+ errno = 0;
+
+ switch (ftype & FTYPE_MODE_EXIST_MASK) {
+ case FTYPE_MODE_MUST_NOT_EXIST:
+ if ( (stat(pOD->optArg.argString, &sb) == 0)
+ || (errno != ENOENT) ){
+ if (errno == 0)
+ errno = EINVAL;
+ fprintf(stderr, zFSOptError, errno, strerror(errno),
+ zFSOptErrNoExist, pOD->optArg.argString, pOD->pz_Name);
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ /* NOTREACHED */
+ }
+ /* FALLTHROUGH */
+
+ default:
+ case FTYPE_MODE_MAY_EXIST:
+ {
+ char * p = strrchr(pOD->optArg.argString, DIRCH);
+ if (p != NULL)
+ *p = NUL;
+ if ( (stat(pOD->optArg.argString, &sb) != 0)
+ || (errno = EINVAL, ! S_ISDIR(sb.st_mode)) ){
+ fprintf(stderr, zFSOptError, errno, strerror(errno),
+ zFSOptErrMayExist, pOD->optArg.argString, pOD->pz_Name);
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ /* NOTREACHED */
+ }
+ *p = '/';
+ break;
+ }
+
+ case FTYPE_MODE_MUST_EXIST:
+ if ( (stat(pOD->optArg.argString, &sb) != 0)
+ || (errno = EINVAL, ! S_ISREG(sb.st_mode)) ){
+ fprintf(stderr, zFSOptError, errno, strerror(errno),
+ zFSOptErrMustExist, pOD->optArg.argString,
+ pOD->pz_Name);
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ /* NOTREACHED */
+ }
+ break;
+ }
+ }
+
+ switch (ftype & FTYPE_MODE_OPEN_MASK) {
+ default:
+ case FTYPE_MODE_NO_OPEN:
+ break;
+
+ case FTYPE_MODE_OPEN_FD:
+ {
+ int fd = open(pOD->optArg.argString, mode.file_flags);
+ if (fd < 0) {
+ fprintf(stderr, zFSOptError, errno, strerror(errno),
+ zFSOptErrOpen, pOD->optArg.argString, pOD->pz_Name);
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ /* NOTREACHED */
+ }
+
+ if ((pOD->fOptState & OPTST_ALLOC_ARG) != 0)
+ pOD->optCookie = (void *)pOD->optArg.argString;
+ else
+ AGDUPSTR(pOD->optCookie, pOD->optArg.argString, "file name");
+
+ pOD->optArg.argFd = fd;
+ pOD->fOptState &= ~OPTST_ALLOC_ARG;
+ break;
+ }
+
+ case FTYPE_MODE_FOPEN_FP:
+ {
+ FILE* fp = fopen(pOD->optArg.argString, mode.file_mode);
+ if (fp == NULL) {
+ fprintf(stderr, zFSOptError, errno, strerror(errno),
+ zFSOptErrFopen, pOD->optArg.argString, pOD->pz_Name);
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ /* NOTREACHED */
+ }
+
+ if ((pOD->fOptState & OPTST_ALLOC_ARG) != 0)
+ pOD->optCookie = (void *)pOD->optArg.argString;
+ else
+ AGDUPSTR(pOD->optCookie, pOD->optArg.argString, "file name");
+
+ pOD->optArg.argFp = fp;
+ pOD->fOptState &= ~OPTST_ALLOC_ARG;
+ break;
+ }
+ }
+}
+/*
+ * Local Variables:
+ * mode: C
+ * c-file-style: "stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * end of autoopts/file.c */
*
* DO NOT EDIT THIS FILE (genshell.c)
*
- * It has been AutoGen-ed Saturday May 5, 2007 at 12:02:35 PM PDT
+ * It has been AutoGen-ed Saturday May 16, 2009 at 08:15:54 AM PDT
* From the definitions genshell.def
* and the template file options
*
- * Generated from AutoOpts 29:0:4 templates.
+ * Generated from AutoOpts @AO_CURRENT@:@AO_REVISION@:@AO_AGE@ templates.
*/
/*
*
* This source file is copyrighted and licensed under the following terms:
*
- * genshellopt copyright 1999-2007 Bruce Korb - all rights reserved
+ * genshellopt copyright 1999-2009 Bruce Korb - all rights reserved
*
- * genshellopt is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
+ * genshellopt 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.
*
- * genshellopt 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
- * Lesser General Public License for more details.
+ * genshellopt 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 Lesser General Public
- * License along with genshellopt. If not, write to:
- * The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301, USA.
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-
+#include <sys/types.h>
#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
#define OPTION_CODE_COMPILE 1
#include "genshell.h"
#ifdef __cplusplus
extern "C" {
#endif
+
+/* TRANSLATORS: choose the translation for option names wisely because you
+ cannot ever change your mind. */
tSCC zCopyright[] =
- "genshellopt copyright (c) 1999-2007 Bruce Korb, all rights reserved";
-tSCC zCopyrightNotice[] =
- "genshellopt is free software; you can redistribute it and/or\n\
-modify it under the terms of the GNU Lesser General Public\n\
-License as published by the Free Software Foundation; either\n\
-version 2.1 of the License, or (at your option) any later version.\n\n\
-genshellopt is distributed in the hope that it will be useful,\n\
-but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n\
-Lesser General Public License for more details.\n\n\
-You should have received a copy of the GNU Lesser General Public\n\
-License along with genshellopt. If not, write to:\n\
-\tThe Free Software Foundation, Inc.,\n\
-\t51 Franklin Street, Fifth Floor\n\
-\tBoston, MA 02110-1301, USA.";
+ "genshellopt copyright (c) 1999-2009 Bruce Korb, all rights reserved";
+tSCC zCopyrightNotice[610] =
+"genshellopt is free software: you can redistribute it and/or modify it under\n\
+the terms of the GNU General Public License as published by the Free Software\n\
+Foundation, either version 3 of the License, or (at your option) any later\n\
+version.\n\n\
+genshellopt is distributed in the hope that it will be useful, but WITHOUT ANY\n\
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n\
+PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\n\
+You should have received a copy of the GNU General Public License along with\n\
+this program. If not, see <http://www.gnu.org/licenses/>.";
+
extern tUsageProc genshelloptUsage;
#ifndef NULL
/*
* Help/More_Help/Version option descriptions:
*/
-tSCC zHelpText[] = "Display usage information and exit";
-tSCC zHelp_Name[] = "help";
-
-tSCC zMore_HelpText[] = "Extended usage information passed thru pager";
-tSCC zMore_Help_Name[] = "more-help";
-
-tSCC zVersionText[] = "Output version information and exit";
-tSCC zVersion_Name[] = "version";
+tSCC zHelpText[] = "Display usage information and exit";
+tSCC zHelp_Name[] = "help";
+tSCC zMore_HelpText[] = "Extended usage information passed thru pager";
+tSCC zMore_Help_Name[] = "more-help";
+tSCC zVersionText[] = "Output version information and exit";
+tSCC zVersion_Name[] = "version";
/*
* Declare option callback procedures
*/
text, the second line of the file through the ending tag will be replaced\n\
by the newly generated text. The first `#!' line will be regenerated.\n";
tSCC zFullVersion[] = GENSHELLOPT_FULL_VERSION;
-/* extracted from optcode.tpl near line 408 */
+/* extracted from optcode.tpl near line 501 */
#if defined(ENABLE_NLS)
# define OPTPROC_BASE OPTPROC_TRANSLATE
# define translate_option_strings NULL
#endif /* ENABLE_NLS */
+
+#define genshellopt_full_usage NULL
+#define genshellopt_short_usage NULL
tOptions genshelloptOptions = {
OPTIONS_STRUCT_VERSION,
0, NULL, /* original argc + argv */
/*
* Indexes to special options
*/
- { INDEX_OPT_MORE_HELP,
- 0 /* no option state saving */,
- NO_EQUIVALENT /* index of '-#' option */,
+ { INDEX_OPT_MORE_HELP, /* more-help option index */
+ NO_EQUIVALENT, /* save option index */
+ NO_EQUIVALENT, /* '-#' option index */
NO_EQUIVALENT /* index of default opt */
},
- 5 /* full option count */, 2 /* user option count */
+ 5 /* full option count */, 2 /* user option count */,
+ genshellopt_full_usage, genshellopt_short_usage,
+ NULL, NULL
};
/*
tOptions* pOptions,
tOptDesc* pOptDesc )
{
+ (void)pOptions;
USAGE( EXIT_SUCCESS );
}
-/* extracted from optcode.tpl near line 514 */
+/* extracted from optcode.tpl near line 633 */
#if ENABLE_NLS
#include <stdio.h>
* Guard against re-translation. It won't work. The strings will have
* been changed by the first pass through this code. One shot only.
*/
- if (option_usage_text.field_ct == 0)
- return;
- /*
- * Do the translations. The first pointer follows the field count field.
- * The field count field is the size of a pointer.
- */
- {
- char** ppz = (char**)(void*)&(option_usage_text);
- int ix = option_usage_text.field_ct;
+ if (option_usage_text.field_ct != 0) {
+
+ /*
+ * Do the translations. The first pointer follows the field count
+ * field. The field count field is the size of a pointer.
+ */
+ tOptDesc* pOD = genshelloptOptions.pOptDesc;
+ char** ppz = (char**)(void*)&(option_usage_text);
+ int ix = option_usage_text.field_ct;
do {
ppz++;
*ppz = AO_gettext(*ppz);
} while (--ix > 0);
+
+ COERSION(pzCopyright);
+ COERSION(pzCopyNotice);
+ COERSION(pzFullVersion);
+ COERSION(pzUsageTitle);
+ COERSION(pzExplain);
+ COERSION(pzDetail);
+ option_usage_text.field_ct = 0;
+
+ for (ix = genshelloptOptions.optCt; ix > 0; ix--, pOD++)
+ coerce_it((void*)&(pOD->pzText));
}
- option_usage_text.field_ct = 0;
- {
+ if ((genshelloptOptions.fOptSet & OPTPROC_NXLAT_OPT_CFG) == 0) {
tOptDesc* pOD = genshelloptOptions.pOptDesc;
- int ix = genshelloptOptions.optCt;
-
- for (;;) {
- pOD->pzText = AO_gettext(pOD->pzText);
- pOD->pz_NAME = AO_gettext(pOD->pz_NAME);
- pOD->pz_Name = AO_gettext(pOD->pz_Name);
- pOD->pz_DisableName = AO_gettext(pOD->pz_DisableName);
- pOD->pz_DisablePfx = AO_gettext(pOD->pz_DisablePfx);
- if (--ix <= 0)
- break;
- pOD++;
+ int ix;
+
+ for (ix = genshelloptOptions.optCt; ix > 0; ix--, pOD++) {
+ coerce_it((void*)&(pOD->pz_Name));
+ coerce_it((void*)&(pOD->pz_DisableName));
+ coerce_it((void*)&(pOD->pz_DisablePfx));
}
+ /* prevent re-translation */
+ genshelloptOptions.fOptSet |= OPTPROC_NXLAT_OPT_CFG | OPTPROC_NXLAT_OPT;
}
- COERSION(pzCopyright);
- COERSION(pzCopyNotice);
- COERSION(pzFullVersion);
- COERSION(pzUsageTitle);
- COERSION(pzExplain);
- COERSION(pzDetail);
}
#endif /* ENABLE_NLS */
*
* DO NOT EDIT THIS FILE (genshell.h)
*
- * It has been AutoGen-ed Saturday May 5, 2007 at 12:02:35 PM PDT
+ * It has been AutoGen-ed Saturday May 16, 2009 at 08:15:54 AM PDT
* From the definitions genshell.def
* and the template file options
*
- * Generated from AutoOpts 29:0:4 templates.
+ * Generated from AutoOpts @AO_CURRENT@:@AO_REVISION@:@AO_AGE@ templates.
*/
/*
*
* This source file is copyrighted and licensed under the following terms:
*
- * genshellopt copyright 1999-2007 Bruce Korb - all rights reserved
+ * genshellopt copyright 1999-2009 Bruce Korb - all rights reserved
*
- * genshellopt is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
+ * genshellopt 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.
*
- * genshellopt 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
- * Lesser General Public License for more details.
+ * genshellopt 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 Lesser General Public
- * License along with genshellopt. If not, write to:
- * The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301, USA.
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* This file contains the programmatic interface to the Automated
* "AutoOpts" chapter. Please refer to that doc for usage help.
*/
#ifndef AUTOOPTS_GENSHELL_H_GUARD
-#define AUTOOPTS_GENSHELL_H_GUARD
+#define AUTOOPTS_GENSHELL_H_GUARD 1
#include <autoopts/options.h>
/*
* tolerable version is at least as old as what was current when the header
* template was released.
*/
-#define AO_TEMPLATE_VERSION 118784
+#define AO_TEMPLATE_VERSION 131073
#if (AO_TEMPLATE_VERSION < OPTIONS_MINIMUM_VERSION) \
|| (AO_TEMPLATE_VERSION > OPTIONS_STRUCT_VERSION)
# error option template version mismatches autoopts/options.h header
* Enumeration of each option:
*/
typedef enum {
- INDEX_OPT_SCRIPT = 0,
- INDEX_OPT_SHELL = 1,
- INDEX_OPT_VERSION = 2,
- INDEX_OPT_HELP = 3,
- INDEX_OPT_MORE_HELP = 4
+ INDEX_OPT_SCRIPT = 0,
+ INDEX_OPT_SHELL = 1,
+ INDEX_OPT_VERSION = 2,
+ INDEX_OPT_HELP = 3,
+ INDEX_OPT_MORE_HELP = 4
} teOptIndex;
#define OPTION_CT 5
DESC(n).fOptState |= OPTST_DISABLED; \
DESC(n).optCookie = NULL )
-/*
+/* * * * * *
+ *
* Interface defines for specific options.
*/
#define VALUE_OPT_SCRIPT 'o'
#define VALUE_OPT_SHELL 's'
-
-#define VALUE_OPT_VERSION 'v'
#define VALUE_OPT_HELP '?'
#define VALUE_OPT_MORE_HELP '!'
+#define VALUE_OPT_VERSION 'v'
/*
* Interface defines not associated with particular options
*/
genshelloptOptions.pzCurOpt = NULL )
#define START_OPT RESTART_OPT(1)
#define USAGE(c) (*genshelloptOptions.pUsageProc)( &genshelloptOptions, c )
-/* extracted from opthead.tpl near line 360 */
+/* extracted from opthead.tpl near line 409 */
/* * * * * *
*
extern tOptions genshelloptOptions;
-#ifndef _
-# if ENABLE_NLS
-# include <stdio.h>
- static inline char* aoGetsText( char const* pz ) {
- if (pz == NULL) return NULL;
- return (char*)gettext( pz );
- }
-# define _(s) aoGetsText(s)
-# else /* ENABLE_NLS */
-# define _(s) s
-# endif /* ENABLE_NLS */
-#endif
+#if defined(ENABLE_NLS)
+# ifndef _
+# include <stdio.h>
+ static inline char* aoGetsText( char const* pz ) {
+ if (pz == NULL) return NULL;
+ return (char*)gettext( pz );
+ }
+# define _(s) aoGetsText(s)
+# endif /* _() */
+
+# define OPT_NO_XLAT_CFG_NAMES STMTS(genshelloptOptions.fOptSet |= \
+ OPTPROC_NXLAT_OPT_CFG;)
+# define OPT_NO_XLAT_OPT_NAMES STMTS(genshelloptOptions.fOptSet |= \
+ OPTPROC_NXLAT_OPT|OPTPROC_NXLAT_OPT_CFG;)
+
+# define OPT_XLAT_CFG_NAMES STMTS(genshelloptOptions.fOptSet &= \
+ ~(OPTPROC_NXLAT_OPT|OPTPROC_NXLAT_OPT_CFG);)
+# define OPT_XLAT_OPT_NAMES STMTS(genshelloptOptions.fOptSet &= \
+ ~OPTPROC_NXLAT_OPT;)
+
+#else /* ENABLE_NLS */
+# define OPT_NO_XLAT_CFG_NAMES
+# define OPT_NO_XLAT_OPT_NAMES
+
+# define OPT_XLAT_CFG_NAMES
+# define OPT_XLAT_OPT_NAMES
+
+# ifndef _
+# define _(_s) _s
+# endif
+#endif /* ENABLE_NLS */
#ifdef __cplusplus
}
#include "autoopts/options.h"
#include "autoopts/usage-txt.h"
#include "genshell.h"
+#include "xat-attribute.h"
+#include "value-type.h"
+#include "ag-char-map.h"
#include "autoopts.h"
#include "proto.h"
+#include "value-type.c"
+#include "xat-attribute.c"
#include "autoopts.c"
#include "boolean.c"
#include "configfile.c"
#include "cook.c"
#include "enumeration.c"
#include "environment.c"
+#include "file.c"
#include "genshell.c"
#include "load.c"
#include "makeshell.c"
#include "numeric.c"
#include "pgusage.c"
#include "putshell.c"
+#include "reset.c"
#include "restore.c"
#include "save.c"
#include "sort.c"
#include "streqvcmp.c"
#include "text_mmap.c"
#include "tokenize.c"
+#include "time.c"
#include "usage.c"
#include "version.c"
/*
- * $Id: load.c,v 4.20 2007/02/04 22:17:39 bkorb Exp $
- * Time-stamp: "2007-02-04 11:54:57 bkorb"
+ * $Id: load.c,v 4.28 2009/01/01 16:51:48 bkorb Exp $
+ * Time-stamp: "2008-12-06 10:16:05 bkorb"
*
* This file contains the routines that deal with processing text strings
* for options, either from a NUL-terminated string passed in or from an
* rc/ini file.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
+ * These files have the following md5sums:
*
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
tOptionLoadMode option_load_mode = OPTION_LOAD_UNCOOKED;
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static ag_bool
insertProgramPath(
char* pzBuf,
* ret-desc: AG_TRUE if the name was handled, otherwise AG_FALSE.
* If the name does not start with ``$'', then it is handled
* simply by copying the input name to the output buffer and
- * resolving the name with either @code{canonicalize_file_name(3GLIBC)}
- * or @code{realpath(3C)}.
+ * resolving the name with either
+ * @code{canonicalize_file_name(3GLIBC)} or @code{realpath(3C)}.
*
* doc:
*
* allocated and we need to deallocate it.
*/
if (pzPath != pzProgPath)
- free( (void*)pzPath );
+ AGFREE(pzPath);
return AG_TRUE;
}
for (;;) {
int ch = (int)*++pzName;
- if (! ISNAMECHAR( ch ))
+ if (! IS_VALUE_NAME_CHAR(ch))
break;
*(pzDir++) = (char)ch;
}
if (mode == OPTION_LOAD_KEEP)
return;
- if (isspace( (int)*pzTxt )) {
+ if (IS_WHITESPACE_CHAR(*pzTxt)) {
char* pzS = pzTxt;
char* pzD = pzTxt;
- while (isspace( (int)*++pzS )) ;
+ while (IS_WHITESPACE_CHAR(*++pzS)) ;
while ((*(pzD++) = *(pzS++)) != NUL) ;
pzE = pzD-1;
} else
pzE = pzTxt + strlen( pzTxt );
- while ((pzE > pzTxt) && isspace( (int)pzE[-1] )) pzE--;
+ while ((pzE > pzTxt) && IS_WHITESPACE_CHAR(pzE[-1])) pzE--;
*pzE = NUL;
if (mode == OPTION_LOAD_UNCOOKED)
static char*
assembleArgValue( char* pzTxt, tOptionLoadMode mode )
{
- tSCC zBrk[] = " \t:=";
+ tSCC zBrk[] = " \t\n:=";
char* pzEnd = strpbrk( pzTxt, zBrk );
int space_break;
* because we'll have to skip over an immediately following ':' or '='
* (and the white space following *that*).
*/
- space_break = isspace((int)*pzEnd);
+ space_break = IS_WHITESPACE_CHAR(*pzEnd);
*(pzEnd++) = NUL;
- while (isspace((int)*pzEnd)) pzEnd++;
+ while (IS_WHITESPACE_CHAR(*pzEnd)) pzEnd++;
if (space_break && ((*pzEnd == ':') || (*pzEnd == '=')))
- while (isspace((int)*++pzEnd)) ;
+ while (IS_WHITESPACE_CHAR(*++pzEnd)) ;
return pzEnd;
}
tDirection direction,
tOptionLoadMode load_mode )
{
- while (isspace( (int)*pzLine )) pzLine++;
+ while (IS_WHITESPACE_CHAR(*pzLine)) pzLine++;
{
char* pzArg = assembleArgValue( pzLine, load_mode );
dnl
dnl DO NOT EDIT THIS FILE (libopts.m4)
dnl
-dnl It has been AutoGen-ed Saturday May 5, 2007 at 12:02:37 PM PDT
+dnl It has been AutoGen-ed Saturday May 16, 2009 at 08:15:55 AM PDT
dnl From the definitions libopts.def
dnl and the template file conftest.tpl
dnl
AC_MSG_ERROR([You must have one of limits.h, sys/limits.h or values.h])
fi
+ # ----------------------------------------------------------------------
+ # check for various programs used during the build.
+ # On OS/X, "wchar.h" needs "runetype.h" to work properly.
+ # ----------------------------------------------------------------------
+ AC_CHECK_HEADERS([runetype.h wchar.h], [], [],[
+ AC_INCLUDES_DEFAULT
+ #if HAVE_RUNETYPE_H
+ # include <runetype.h>
+ #endif
+ ])
+
+ # ----------------------------------------------------------------------
+ # Checks for typedefs
+ # ----------------------------------------------------------------------
+ AC_CHECK_TYPES(wchar_t)
+ AC_CHECK_TYPES(wint_t, [], [], [
+ AC_INCLUDES_DEFAULT
+ #if HAVE_RUNETYPE_H
+ # include <runetype.h>
+ #endif
+ #if HAVE_WCHAR_H
+ # include <wchar.h>
+ #endif
+ ])
+
# ========================
# ...and int types headers
# ========================
AC_CHECK_HEADERS(stdint.h inttypes.h, break)
AC_CHECK_TYPES([int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t,
- intptr_t, uint_t])
+ intptr_t, uintptr_t, uint_t, pid_t, size_t])
- # ====================
- # uintptr type & sizes
- # ====================
- AC_CHECK_TYPES([uintptr_t], ,
- [AC_DEFINE([uintptr_t], unsigned long,
- [Alternate uintptr_t for systems without it.])])
+ # =====
+ # sizes
+ # =====
AC_CHECK_SIZEOF(char*, 4)
AC_CHECK_SIZEOF(int, 4)
AC_CHECK_SIZEOF(long, 4)
# ----------------------------------------------------------------------
AC_CHECK_LIB(gen, pathfind)
AC_FUNC_VPRINTF
- AC_CHECK_FUNCS([mmap canonicalize_file_name snprintf strdup strchr strrchr])
+ AC_CHECK_FUNCS([mmap canonicalize_file_name snprintf strdup strchr \
+ strrchr strsignal])
[ INVOKE_LIBOPTS_MACROS_FIRST_done=yes
fi]])
dnl @synopsis LIBOPTS_CHECK
dnl
-dnl Time-stamp: "2006-09-23 19:36:24 bkorb"
-dnl Last Committed: $Date: 2006/09/24 02:59:00 $
+dnl Time-stamp: "2007-07-04 11:41:40 bkorb"
+dnl Last Committed: $Date: 2007/07/04 20:51:20 $
dnl
dnl If autoopts-config works, add the linking information to LIBS.
dnl Otherwise, add ``libopts-${ao_rev}'' to SUBDIRS and run all
dnl the config tests that the library needs. Invoke the
dnl "INVOKE_LIBOPTS_MACROS" macro iff we are building libopts.
dnl
+dnl This file is part of AutoGen.
+dnl AutoGen copyright (c) 1992-2007 Bruce Korb - all rights reserved
+dnl
+dnl AutoGen is free software: you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation, either version 3 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl AutoGen is distributed in the hope that it will be useful, but
+dnl WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+dnl See the GNU General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License along
+dnl with this program. If not, see <http://www.gnu.org/licenses/>.
+dnl
dnl Default to system libopts
dnl
AC_DEFUN([LIBOPTS_CHECK],[
# liboptschk.m4 serial 1 (autogen - 5.7.3)
-dnl Copyright (C) 2005 Free Software Foundation, Inc.
+dnl copyright (c) 2005 by Bruce Korb - all rights reserved
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
dnl Time-stamp: "2006-09-23 19:42:31 bkorb"
-dnl Last Committed: $Date: 2006/09/24 02:59:00 $
+dnl Last Committed: $Date: 2007/07/04 20:51:18 $
dnl This file can can be used in projects which are not available under
dnl the GNU General Public License or the GNU Library General Public
/*
- * $Id: makeshell.c,v 4.20 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2007-01-27 06:05:45 bkorb"
+ * $Id: makeshell.c,v 4.28 2009/01/01 16:51:48 bkorb Exp $
+ * Time-stamp: "2008-07-26 16:10:51 bkorb"
*
* This module will interpret the options set in the tOptions
* structure and create a Bourne shell script capable of parsing them.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
+ * These files have the following md5sums:
*
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
tOptions* pShellParseOptions = NULL;
static char* pzTrailer = NULL;
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static void
textToVariable( tOptions* pOpts, teTextTo whichVar, tOptDesc* pOD );
*/
switch (OPTST_GET_ARGTYPE(pOptDesc->fOptState)) {
case OPARG_TYPE_ENUMERATION:
- (*(pOptDesc->pOptProc))( (tOptions*)2UL, pOptDesc );
+ (*(pOptDesc->pOptProc))(OPTPROC_EMIT_SHELL, pOptDesc );
pzDefault = pOptDesc->optArg.argString;
break;
if (SKIP_OPT(pOptDesc))
continue;
- if (isprint( pOptDesc->optValue )) {
+ if (IS_GRAPHIC_CHAR(pOptDesc->optValue)) {
printf( zOptionFlag, pOptDesc->optValue );
printOptionAction( pOpts, pOptDesc );
}
/*
- * $Id: nested.c,v 4.14 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2007-01-26 11:04:35 bkorb"
+ * $Id: nested.c,v 4.27 2009/01/01 16:51:48 bkorb Exp $
+ * Time-stamp: "2008-07-28 19:18:28 bkorb"
*
* Automated Options Nested Values module.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
+ * These files have the following md5sums:
*
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
+
+typedef struct {
+ int xml_ch;
+ int xml_len;
+ char xml_txt[8];
+} xml_xlate_t;
+
+static xml_xlate_t const xml_xlate[] = {
+ { '&', 4, "amp;" },
+ { '<', 3, "lt;" },
+ { '>', 3, "gt;" },
+ { '"', 5, "quot;" },
+ { '\'',5, "apos;" }
+};
+
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static void
-removeBackslashes( char* pzSrc );
+removeLineContinue( char* pzSrc );
static char const*
scanQuotedString( char const* pzTxt );
sortNestedList( tArgList* pAL );
/* = = = END-STATIC-FORWARD = = = */
-/* removeBackslashes
+/* removeLineContinue
*
- * This function assumes that all newline characters were preceeded by
- * backslashes that need removal.
+ * Backslashes are used for line continuations. We keep the newline
+ * characters, but trim out the backslash:
*/
static void
-removeBackslashes( char* pzSrc )
+removeLineContinue( char* pzSrc )
{
- char* pzD = strchr(pzSrc, '\n');
+ char* pzD;
- if (pzD == NULL)
- return;
- *--pzD = '\n';
+ do {
+ while (*pzSrc == '\n') pzSrc++;
+ pzD = strchr(pzSrc, '\n');
+ if (pzD == NULL)
+ return;
+ /*
+ * pzD has skipped at least one non-newline character and now
+ * points to a newline character. It now becomes the source and
+ * pzD goes to the previous character.
+ */
+ pzSrc = pzD--;
+ if (*pzD != '\\')
+ pzD++;
+ } while (pzD == pzSrc);
+
+ /*
+ * Start shifting text.
+ */
for (;;) {
char ch = ((*pzD++) = *(pzSrc++));
switch (ch) {
- case '\n': *--pzD = ch; break;
case NUL: return;
- default:
- ;
+ case '\\':
+ if (*pzSrc == '\n')
+ --pzD; /* rewrite on next iteration */
}
}
}
} else {
pNV->valType = OPARG_TYPE_STRING;
- if (dataLen > 0)
- memcpy( pNV->v.strVal, pzValue, dataLen );
- pNV->v.strVal[dataLen] = NUL;
+ if (dataLen > 0) {
+ char const * pzSrc = pzValue;
+ char * pzDst = pNV->v.strVal;
+ int ct = dataLen;
+ do {
+ int ch = *(pzSrc++) & 0xFF;
+ if (ch == NUL) goto data_copy_done;
+ if (ch == '&')
+ ch = get_special_char(&pzSrc, &ct);
+ *(pzDst++) = ch;
+ } while (--ct > 0);
+ data_copy_done:
+ *pzDst = NUL;
+
+ } else {
+ pNV->v.strVal[0] = NUL;
+ }
+
pNV->pzName = pNV->v.strVal + dataLen + 1;
}
pNV = AGALOC( sz, "option name/bool value pair" );
if (pNV == NULL)
return NULL;
- while (isspace( (int)*pzValue ) && (dataLen > 0)) {
+ while (IS_WHITESPACE_CHAR(*pzValue) && (dataLen > 0)) {
dataLen--; pzValue++;
}
if (dataLen == 0)
pNV->v.boolVal = 0;
- else if (isdigit( (int)*pzValue ))
- pNV->v.boolVal = atoi( pzValue );
- else switch (*pzValue) {
- case 'f':
- case 'F':
- case 'n':
- case 'N':
- pNV->v.boolVal = 0; break;
- default:
- pNV->v.boolVal = 1;
- }
+
+ else if (IS_DEC_DIGIT_CHAR(*pzValue))
+ pNV->v.boolVal = atoi(pzValue);
+
+ else pNV->v.boolVal = ! IS_FALSE_TYPE_CHAR(*pzValue);
pNV->valType = OPARG_TYPE_BOOLEAN;
pNV->pzName = (char*)(pNV + 1);
pNV = AGALOC( sz, "option name/bool value pair" );
if (pNV == NULL)
return NULL;
- while (isspace( (int)*pzValue ) && (dataLen > 0)) {
+ while (IS_WHITESPACE_CHAR(*pzValue) && (dataLen > 0)) {
dataLen--; pzValue++;
}
if (dataLen == 0)
- pNV->v.boolVal = 0;
+ pNV->v.longVal = 0;
else
- pNV->v.boolVal = atoi( pzValue );
+ pNV->v.longVal = strtol(pzValue, 0, 0);
pNV->valType = OPARG_TYPE_NUMERIC;
- pNV->pzName = (char*)(pNV + 1);
+ pNV->pzName = (char*)(pNV + 1);
memcpy( pNV->pzName, pzName, nameLen );
pNV->pzName[ nameLen ] = NUL;
addArgListEntry( pp, pNV );
scanNameEntry(char const* pzName, tOptionValue* pRes)
{
tOptionValue* pNV;
- char const * pzScan = pzName+1;
+ char const * pzScan = pzName+1; /* we know first char is a name char */
char const * pzVal;
size_t nameLen = 1;
size_t dataLen = 0;
- while (ISNAMECHAR( (int)*pzScan )) { pzScan++; nameLen++; }
-
- while (isspace( (int)*pzScan )) {
- char ch = *(pzScan++);
- if ((ch == '\n') || (ch == ',')) {
- addStringValue(&(pRes->v.nestVal), pzName, nameLen, NULL,(size_t)0);
- return pzScan - 1;
- }
- }
+ /*
+ * Scan over characters that name a value. These names may not end
+ * with a colon, but they may contain colons.
+ */
+ while (IS_VALUE_NAME_CHAR(*pzScan)) { pzScan++; nameLen++; }
+ if (pzScan[-1] == ':') { pzScan--; nameLen--; }
+ while (IS_HORIZ_WHITE_CHAR(*pzScan)) pzScan++;
+re_switch:
switch (*pzScan) {
case '=':
case ':':
- while (isspace( (int)*++pzScan )) ;
- switch (*pzScan) {
- case ',': goto comma_char;
- case '"':
- case '\'': goto quote_char;
- case NUL: goto nul_byte;
- default: goto default_char;
- }
+ while (IS_HORIZ_WHITE_CHAR( (int)*++pzScan )) ;
+ if ((*pzScan == '=') || (*pzScan == ':'))
+ goto default_char;
+ goto re_switch;
+ case '\n':
case ',':
- comma_char:
pzScan++;
/* FALLTHROUGH */
case NUL:
- nul_byte:
addStringValue(&(pRes->v.nestVal), pzName, nameLen, NULL, (size_t)0);
break;
case '"':
case '\'':
- quote_char:
pzVal = pzScan;
pzScan = scanQuotedString( pzScan );
dataLen = pzScan - pzVal;
pNV = addStringValue( &(pRes->v.nestVal), pzName, nameLen,
pzVal, dataLen );
if (pNV != NULL)
- removeBackslashes( pNV->v.strVal );
+ removeLineContinue( pNV->v.strVal );
goto leave_scan_name;
}
}
tOptionValue* pNewVal;
tOptionLoadMode save_mode = option_load_mode;
- if (! isalpha((int)*pzName)) {
+ if (! IS_VAR_FIRST_CHAR(*pzName)) {
switch (*pzName) {
default:
pzName = NULL;
return pzName;
}
- while (isalpha( (int)*++pzScan )) nameLen++;
+ pzScan++;
+ while (IS_VALUE_NAME_CHAR( (int)*pzScan )) { pzScan++; nameLen++; }
if (nameLen > 64)
return NULL;
valu.valType = OPARG_TYPE_STRING;
}
addStringValue(&(pRes->v.nestVal), pzName, nameLen, NULL, (size_t)0);
option_load_mode = save_mode;
- return pzScan+2;
+ return pzScan+1;
default:
option_load_mode = save_mode;
}
valLen = (pzScan - pzVal);
pzScan += nameLen + 3;
- while (isspace( (int)*pzScan )) pzScan++;
+ while (IS_WHITESPACE_CHAR(*pzScan)) pzScan++;
}
switch (valu.valType) {
errno = EINVAL;
return NULL;
}
- while (isspace( (int)*pzTxt )) pzTxt++;
+ while (IS_WHITESPACE_CHAR(*pzTxt)) pzTxt++;
if (*pzTxt == NUL) {
errno = ENOENT;
return NULL;
* Scan until we hit a NUL.
*/
do {
- while (isspace( (int)*pzTxt )) pzTxt++;
- if (isalpha( (int)*pzTxt )) {
+ while (IS_WHITESPACE_CHAR( (int)*pzTxt )) pzTxt++;
+ if (IS_VAR_FIRST_CHAR( (int)*pzTxt )) {
pzTxt = scanNameEntry( pzTxt, pRes );
}
else switch (*pzTxt) {
case NUL: goto scan_done;
case '<': pzTxt = scanXmlEntry( pzTxt, pRes );
+ if (pzTxt == NULL) goto woops;
if (*pzTxt == ',') pzTxt++; break;
case '#': pzTxt = strchr( pzTxt, '\n' ); break;
default: goto woops;
* Nested value was found on the command line
=*/
void
-optionNestedVal( tOptions* pOpts, tOptDesc* pOD )
+optionNestedVal(tOptions* pOpts, tOptDesc* pOD)
{
- tOptionValue* pOV = optionLoadNested(
- pOD->optArg.argString, pOD->pz_Name, strlen(pOD->pz_Name));
+ if (pOpts < OPTPROC_EMIT_LIMIT)
+ return;
+
+ if (pOD->fOptState & OPTST_RESET) {
+ tArgList* pAL = pOD->optCookie;
+ int ct;
+ tCC ** av;
+
+ if (pAL == NULL)
+ return;
+ ct = pAL->useCt;
+ av = pAL->apzArgs;
+
+ while (--ct >= 0) {
+ void * p = (void *)*(av++);
+ optionUnloadNested((tOptionValue const *)p);
+ }
+
+ AGFREE(pOD->optCookie);
- if (pOV != NULL)
- addArgListEntry( &(pOD->optCookie), (void*)pOV );
+ } else {
+ tOptionValue* pOV = optionLoadNested(
+ pOD->optArg.argString, pOD->pz_Name, strlen(pOD->pz_Name));
+
+ if (pOV != NULL)
+ addArgListEntry( &(pOD->optCookie), (void*)pOV );
+ }
}
+
+
+/*
+ * get_special_char
+ */
+LOCAL int
+get_special_char(char const ** ppz, int * ct)
+{
+ char const * pz = *ppz;
+
+ if (*ct < 3)
+ return '&';
+
+ if (*pz == '#') {
+ int base = 10;
+ int retch;
+
+ pz++;
+ if (*pz == 'x') {
+ base = 16;
+ pz++;
+ }
+ retch = (int)strtoul(pz, (char **)&pz, base);
+ if (*pz != ';')
+ return '&';
+ base = ++pz - *ppz;
+ if (base > *ct)
+ return '&';
+
+ *ct -= base;
+ *ppz = pz;
+ return retch;
+ }
+
+ {
+ int ctr = sizeof(xml_xlate) / sizeof(xml_xlate[0]);
+ xml_xlate_t const * xlatp = xml_xlate;
+
+ for (;;) {
+ if ( (*ct >= xlatp->xml_len)
+ && (strncmp(pz, xlatp->xml_txt, xlatp->xml_len) == 0)) {
+ *ppz += xlatp->xml_len;
+ *ct -= xlatp->xml_len;
+ return xlatp->xml_ch;
+ }
+
+ if (--ctr <= 0)
+ break;
+ xlatp++;
+ }
+ }
+ return '&';
+}
+
+
+/*
+ * emit_special_char
+ */
+LOCAL void
+emit_special_char(FILE * fp, int ch)
+{
+ int ctr = sizeof(xml_xlate) / sizeof(xml_xlate[0]);
+ xml_xlate_t const * xlatp = xml_xlate;
+
+ putc('&', fp);
+ for (;;) {
+ if (ch == xlatp->xml_ch) {
+ fputs(xlatp->xml_txt, fp);
+ return;
+ }
+ if (--ctr <= 0)
+ break;
+ xlatp++;
+ }
+ fprintf(fp, "#x%02X;", (ch & 0xFF));
+}
+
/*
* Local Variables:
* mode: C
/*
- * $Id: numeric.c,v 4.11 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2007-01-13 10:28:20 bkorb"
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
+ * $Id: numeric.c,v 4.21 2009/01/17 22:08:07 bkorb Exp $
+ * Time-stamp: "2009-01-11 18:05:28 bkorb"
*
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * Automated Options 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.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * These files have the following md5sums:
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
+ */
+
+/*=export_func optionShowRange
+ * private:
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
+ * what:
+ * arg: + tOptions* + pOpts + program options descriptor +
+ * arg: + tOptDesc* + pOptDesc + the descriptor for this arg +
+ * arg: + void * + rng_table + the value range tables +
+ * arg: + int + rng_count + the number of entries +
*
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
- */
+ * doc:
+ * Show information about a numeric option with range constraints.
+=*/
+void
+optionShowRange(tOptions* pOpts, tOptDesc* pOD, void * rng_table, int rng_ct)
+{
+ static char const bullet[] = "\t\t\t\t- ";
+ static char const deepin[] = "\t\t\t\t ";
+ static char const onetab[] = "\t";
+
+ const struct {long const rmin, rmax;} * rng = rng_table;
+
+ char const * pz_indent =
+ (pOpts != OPTPROC_EMIT_USAGE) ? onetab : bullet;
+
+ if ((pOpts == OPTPROC_EMIT_USAGE) || (pOpts > OPTPROC_EMIT_LIMIT)) {
+ char const * lie_in_range = zRangeLie;
+
+ if (pOpts > OPTPROC_EMIT_LIMIT) {
+ fprintf(option_usage_fp, zRangeErr,
+ pOpts->pzProgName, pOD->pz_Name, pOD->optArg.argString);
+ fprintf(option_usage_fp, "The %s option:\n", pOD->pz_Name);
+ lie_in_range = zRangeBadLie;
+ pz_indent = "";
+ }
+
+ if (pOD->fOptState & OPTST_SCALED_NUM)
+ fprintf(option_usage_fp, zRangeScaled, pz_indent);
+
+ if (rng_ct > 1) {
+ fprintf(option_usage_fp, lie_in_range, pz_indent);
+ pz_indent =
+ (pOpts != OPTPROC_EMIT_USAGE) ? onetab : deepin;
+
+ } else {
+ fprintf(option_usage_fp, zRangeOnly, pz_indent);
+ pz_indent = onetab + 1; /* empty string */
+ }
+
+ for (;;) {
+ if (rng->rmax == LONG_MIN)
+ fprintf(option_usage_fp, zRangeExact, pz_indent, rng->rmin);
+ else if (rng->rmin == LONG_MIN)
+ fprintf(option_usage_fp, zRangeUpto, pz_indent, rng->rmax);
+ else if (rng->rmax == LONG_MAX)
+ fprintf(option_usage_fp, zRangeAbove, pz_indent, rng->rmin);
+ else
+ fprintf(option_usage_fp, zRange, pz_indent, rng->rmin,
+ rng->rmax);
+
+ if (--rng_ct <= 0) {
+ fputc('\n', option_usage_fp);
+ break;
+ }
+ fputs(zRangeOr, option_usage_fp);
+ rng++;
+ pz_indent =
+ (pOpts != OPTPROC_EMIT_USAGE) ? onetab : deepin;
+ }
+
+ if (pOpts > OPTPROC_EMIT_LIMIT)
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ }
+}
+
/*=export_func optionNumericVal
* private:
*
- * what: Decipher a boolean value
+ * what: process an option with a numeric value.
* arg: + tOptions* + pOpts + program options descriptor +
* arg: + tOptDesc* + pOptDesc + the descriptor for this arg +
*
* Decipher a numeric value.
=*/
void
-optionNumericVal( tOptions* pOpts, tOptDesc* pOD )
+optionNumericVal(tOptions* pOpts, tOptDesc* pOD )
{
char* pz;
long val;
+ if ((pOD->fOptState & OPTST_RESET) != 0)
+ return;
+
/*
* Numeric options may have a range associated with it.
* If it does, the usage procedure requests that it be
if ((pOD == NULL) || (pOD->optArg.argString == NULL))
return;
- val = strtol( pOD->optArg.argString, &pz, 0 );
- if (*pz != NUL) {
- fprintf( stderr, zNotNumber, pOpts->pzProgName, pOD->optArg.argString );
- (*(pOpts->pUsageProc))(pOpts, EXIT_FAILURE);
- }
+ errno = 0;
+ val = strtol(pOD->optArg.argString, &pz, 0);
+ if ((pz == pOD->optArg.argString) || (errno != 0))
+ goto bad_number;
+
+ if ((pOD->fOptState & OPTST_SCALED_NUM) != 0)
+ switch (*(pz++)) {
+ case '\0': pz--; break;
+ case 't': val *= 1000;
+ case 'g': val *= 1000;
+ case 'm': val *= 1000;
+ case 'k': val *= 1000; break;
+
+ case 'T': val *= 1024;
+ case 'G': val *= 1024;
+ case 'M': val *= 1024;
+ case 'K': val *= 1024; break;
+
+ default: goto bad_number;
+ }
+
+ if (*pz != NUL)
+ goto bad_number;
if (pOD->fOptState & OPTST_ALLOC_ARG) {
AGFREE(pOD->optArg.argString);
}
pOD->optArg.argInt = val;
+ return;
+
+bad_number:
+ fprintf( stderr, zNotNumber, pOpts->pzProgName, pOD->optArg.argString );
+ if ((pOpts->fOptSet & OPTPROC_ERRSTOP) != 0)
+ (*(pOpts->pUsageProc))(pOpts, EXIT_FAILURE);
+
+ pOD->optArg.argInt = ~0;
}
+
/*
* Local Variables:
* mode: C
--- /dev/null
+/* Parse a time duration and return a seconds count
+ Copyright (C) 2008 Free Software Foundation, Inc.
+ Written by Bruce Korb <bkorb@gnu.org>, 2008.
+
+ 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 <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "parse-duration.h"
+
+#ifndef _
+#define _(_s) _s
+#endif
+
+#ifndef NUL
+#define NUL '\0'
+#endif
+
+#define cch_t char const
+
+typedef enum {
+ NOTHING_IS_DONE,
+ YEAR_IS_DONE,
+ MONTH_IS_DONE,
+ WEEK_IS_DONE,
+ DAY_IS_DONE,
+ HOUR_IS_DONE,
+ MINUTE_IS_DONE,
+ SECOND_IS_DONE
+} whats_done_t;
+
+#define SEC_PER_MIN 60
+#define SEC_PER_HR (SEC_PER_MIN * 60)
+#define SEC_PER_DAY (SEC_PER_HR * 24)
+#define SEC_PER_WEEK (SEC_PER_DAY * 7)
+#define SEC_PER_MONTH (SEC_PER_DAY * 30)
+#define SEC_PER_YEAR (SEC_PER_DAY * 365)
+
+#define TIME_MAX 0x7FFFFFFF
+
+static unsigned long inline
+str_const_to_ul (cch_t * str, cch_t ** ppz, int base)
+{
+ return strtoul (str, (char **)ppz, base);
+}
+
+static long inline
+str_const_to_l (cch_t * str, cch_t ** ppz, int base)
+{
+ return strtol (str, (char **)ppz, base);
+}
+
+static time_t inline
+scale_n_add (time_t base, time_t val, int scale)
+{
+ if (base == BAD_TIME)
+ {
+ if (errno == 0)
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ if (val > TIME_MAX / scale)
+ {
+ errno = ERANGE;
+ return BAD_TIME;
+ }
+
+ val *= scale;
+ if (base > TIME_MAX - val)
+ {
+ errno = ERANGE;
+ return BAD_TIME;
+ }
+
+ return base + val;
+}
+
+static time_t
+parse_hr_min_sec (time_t start, cch_t * pz)
+{
+ int lpct = 0;
+
+ errno = 0;
+
+ /* For as long as our scanner pointer points to a colon *AND*
+ we've not looped before, then keep looping. (two iterations max) */
+ while ((*pz == ':') && (lpct++ <= 1))
+ {
+ unsigned long v = str_const_to_ul (pz+1, &pz, 10);
+
+ if (errno != 0)
+ return BAD_TIME;
+
+ start = scale_n_add (v, start, 60);
+
+ if (errno != 0)
+ return BAD_TIME;
+ }
+
+ /* allow for trailing spaces */
+ while (isspace ((unsigned char)*pz)) pz++;
+ if (*pz != NUL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ return start;
+}
+
+static time_t
+parse_scaled_value (time_t base, cch_t ** ppz, cch_t * endp, int scale)
+{
+ cch_t * pz = *ppz;
+ time_t val;
+
+ if (base == BAD_TIME)
+ return base;
+
+ errno = 0;
+ val = str_const_to_ul (pz, &pz, 10);
+ if (errno != 0)
+ return BAD_TIME;
+ while (isspace ((unsigned char)*pz)) pz++;
+ if (pz != endp)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ *ppz = pz;
+ return scale_n_add (base, val, scale);
+}
+
+static time_t
+parse_year_month_day (cch_t * pz, cch_t * ps)
+{
+ time_t res = 0;
+
+ res = parse_scaled_value (0, &pz, ps, SEC_PER_YEAR);
+
+ ps = strchr (++pz, '-');
+ if (ps == NULL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_MONTH);
+
+ pz++;
+ ps = pz + strlen (pz);
+ return parse_scaled_value (res, &pz, ps, SEC_PER_DAY);
+}
+
+static time_t
+parse_yearmonthday (cch_t * in_pz)
+{
+ time_t res = 0;
+ char buf[8];
+ cch_t * pz;
+
+ if (strlen (in_pz) != 8)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ memcpy (buf, in_pz, 4);
+ buf[4] = NUL;
+ pz = buf;
+ res = parse_scaled_value (0, &pz, buf + 4, SEC_PER_YEAR);
+
+ memcpy (buf, in_pz + 4, 2);
+ buf[2] = NUL;
+ pz = buf;
+ res = parse_scaled_value (res, &pz, buf + 2, SEC_PER_MONTH);
+
+ memcpy (buf, in_pz + 6, 2);
+ buf[2] = NUL;
+ pz = buf;
+ return parse_scaled_value (res, &pz, buf + 2, SEC_PER_DAY);
+}
+
+static time_t
+parse_YMWD (cch_t * pz)
+{
+ time_t res = 0;
+ cch_t * ps = strchr (pz, 'Y');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (0, &pz, ps, SEC_PER_YEAR);
+ pz++;
+ }
+
+ ps = strchr (pz, 'M');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_MONTH);
+ pz++;
+ }
+
+ ps = strchr (pz, 'W');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_WEEK);
+ pz++;
+ }
+
+ ps = strchr (pz, 'D');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_DAY);
+ pz++;
+ }
+
+ while (isspace ((unsigned char)*pz)) pz++;
+ if (*pz != NUL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ return res;
+}
+
+static time_t
+parse_hour_minute_second (cch_t * pz, cch_t * ps)
+{
+ time_t res = 0;
+
+ res = parse_scaled_value (0, &pz, ps, SEC_PER_HR);
+
+ ps = strchr (++pz, ':');
+ if (ps == NULL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_MIN);
+
+ pz++;
+ ps = pz + strlen (pz);
+ return parse_scaled_value (res, &pz, ps, 1);
+}
+
+static time_t
+parse_hourminutesecond (cch_t * in_pz)
+{
+ time_t res = 0;
+ char buf[4];
+ cch_t * pz;
+
+ if (strlen (in_pz) != 6)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ memcpy (buf, in_pz, 2);
+ buf[2] = NUL;
+ pz = buf;
+ res = parse_scaled_value (0, &pz, buf + 2, SEC_PER_HR);
+
+ memcpy (buf, in_pz + 2, 2);
+ buf[2] = NUL;
+ pz = buf;
+ res = parse_scaled_value (res, &pz, buf + 2, SEC_PER_MIN);
+
+ memcpy (buf, in_pz + 4, 2);
+ buf[2] = NUL;
+ pz = buf;
+ return parse_scaled_value (res, &pz, buf + 2, 1);
+}
+
+static time_t
+parse_HMS (cch_t * pz)
+{
+ time_t res = 0;
+ cch_t * ps = strchr (pz, 'H');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (0, &pz, ps, SEC_PER_HR);
+ pz++;
+ }
+
+ ps = strchr (pz, 'M');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_MIN);
+ pz++;
+ }
+
+ ps = strchr (pz, 'S');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, 1);
+ pz++;
+ }
+
+ while (isspace ((unsigned char)*pz)) pz++;
+ if (*pz != NUL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ return res;
+}
+
+static time_t
+parse_time (cch_t * pz)
+{
+ cch_t * ps;
+ time_t res = 0;
+
+ /*
+ * Scan for a hyphen
+ */
+ ps = strchr (pz, ':');
+ if (ps != NULL)
+ {
+ res = parse_hour_minute_second (pz, ps);
+ }
+
+ /*
+ * Try for a 'H', 'M' or 'S' suffix
+ */
+ else if (ps = strpbrk (pz, "HMS"),
+ ps == NULL)
+ {
+ /* Its a YYYYMMDD format: */
+ res = parse_hourminutesecond (pz);
+ }
+
+ else
+ res = parse_HMS (pz);
+
+ return res;
+}
+
+static char *
+trim(char * pz)
+{
+ /* trim leading white space */
+ while (isspace ((unsigned char)*pz)) pz++;
+
+ /* trim trailing white space */
+ {
+ char * pe = pz + strlen (pz);
+ while ((pe > pz) && isspace ((unsigned char)pe[-1])) pe--;
+ *pe = NUL;
+ }
+
+ return pz;
+}
+
+/*
+ * Parse the year/months/days of a time period
+ */
+static time_t
+parse_period (cch_t * in_pz)
+{
+ char * pz = xstrdup (in_pz);
+ char * pT = strchr (pz, 'T');
+ char * ps;
+ void * fptr = pz;
+ time_t res = 0;
+
+ if (pT != NUL)
+ {
+ *(pT++) = NUL;
+ pz = trim (pz);
+ pT = trim (pT);
+ }
+
+ /*
+ * Scan for a hyphen
+ */
+ ps = strchr (pz, '-');
+ if (ps != NULL)
+ {
+ res = parse_year_month_day (pz, ps);
+ }
+
+ /*
+ * Try for a 'Y', 'M' or 'D' suffix
+ */
+ else if (ps = strpbrk (pz, "YMWD"),
+ ps == NULL)
+ {
+ /* Its a YYYYMMDD format: */
+ res = parse_yearmonthday (pz);
+ }
+
+ else
+ res = parse_YMWD (pz);
+
+ if ((errno == 0) && (pT != NULL))
+ {
+ time_t val = parse_time (pT);
+ res = scale_n_add (res, val, 1);
+ }
+
+ free (fptr);
+ return res;
+}
+
+static time_t
+parse_non_iso8601(cch_t * pz)
+{
+ whats_done_t whatd_we_do = NOTHING_IS_DONE;
+
+ time_t res = 0;
+
+ do {
+ time_t val;
+
+ errno = 0;
+ val = str_const_to_l (pz, &pz, 10);
+ if (errno != 0)
+ goto bad_time;
+
+ /* IF we find a colon, then we're going to have a seconds value.
+ We will not loop here any more. We cannot already have parsed
+ a minute value and if we've parsed an hour value, then the result
+ value has to be less than an hour. */
+ if (*pz == ':')
+ {
+ if (whatd_we_do >= MINUTE_IS_DONE)
+ break;
+
+ val = parse_hr_min_sec (val, pz);
+
+ if ((whatd_we_do == HOUR_IS_DONE) && (val >= SEC_PER_HR))
+ break;
+
+ return scale_n_add (res, val, 1);
+ }
+
+ {
+ unsigned int mult;
+
+ /* Skip over white space following the number we just parsed. */
+ while (isspace ((unsigned char)*pz)) pz++;
+
+ switch (*pz)
+ {
+ default: goto bad_time;
+ case NUL:
+ return scale_n_add (res, val, 1);
+
+ case 'y': case 'Y':
+ if (whatd_we_do >= YEAR_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_YEAR;
+ whatd_we_do = YEAR_IS_DONE;
+ break;
+
+ case 'M':
+ if (whatd_we_do >= MONTH_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_MONTH;
+ whatd_we_do = MONTH_IS_DONE;
+ break;
+
+ case 'W':
+ if (whatd_we_do >= WEEK_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_WEEK;
+ whatd_we_do = WEEK_IS_DONE;
+ break;
+
+ case 'd': case 'D':
+ if (whatd_we_do >= DAY_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_DAY;
+ whatd_we_do = DAY_IS_DONE;
+ break;
+
+ case 'h':
+ if (whatd_we_do >= HOUR_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_HR;
+ whatd_we_do = HOUR_IS_DONE;
+ break;
+
+ case 'm':
+ if (whatd_we_do >= MINUTE_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_MIN;
+ whatd_we_do = MINUTE_IS_DONE;
+ break;
+
+ case 's':
+ mult = 1;
+ whatd_we_do = SECOND_IS_DONE;
+ break;
+ }
+
+ res = scale_n_add (res, val, mult);
+
+ while (isspace ((unsigned char)*++pz)) ;
+ if (*pz == NUL)
+ return res;
+
+ if (! isdigit ((unsigned char)*pz))
+ break;
+ }
+
+ } while (whatd_we_do < SECOND_IS_DONE);
+
+ bad_time:
+ errno = EINVAL;
+ return BAD_TIME;
+}
+
+time_t
+parse_duration (char const * pz)
+{
+ time_t res = 0;
+
+ while (isspace ((unsigned char)*pz)) pz++;
+
+ do {
+ if (*pz == 'P')
+ {
+ res = parse_period (pz + 1);
+ if ((errno != 0) || (res == BAD_TIME))
+ break;
+ return res;
+ }
+
+ if (*pz == 'T')
+ {
+ res = parse_time (pz + 1);
+ if ((errno != 0) || (res == BAD_TIME))
+ break;
+ return res;
+ }
+
+ if (! isdigit ((unsigned char)*pz))
+ break;
+
+ res = parse_non_iso8601 (pz);
+ if ((errno == 0) && (res != BAD_TIME))
+ return res;
+
+ } while (0);
+
+ fprintf (stderr, _("Invalid time duration: %s\n"), pz);
+ if (errno == 0)
+ errno = EINVAL;
+ return BAD_TIME;
+}
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-file-style: "gnu"
+ * indent-tabs-mode: nil
+ * End:
+ * end of parse-duration.c */
--- /dev/null
+/* Parse a time duration and return a seconds count
+ Copyright (C) 2008 Free Software Foundation, Inc.
+ Written by Bruce Korb <bkorb@gnu.org>, 2008.
+
+ 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 <http://www.gnu.org/licenses/>. */
+
+/*
+
+ Readers and users of this function are referred to the ISO-8601
+ specification, with particular attention to "Durations".
+
+ At the time of writing, this worked:
+
+ http://en.wikipedia.org/wiki/ISO_8601#Durations
+
+ The string must start with a 'P', 'T' or a digit.
+
+ ==== if it is a digit
+
+ the string may contain: NNN d NNN h NNN m NNN s
+ This represents NNN days, NNN hours, NNN minutes and NNN seconds.
+ The embeded white space is optional.
+ These terms must appear in this order.
+ The final "s" is optional.
+ All of the terms ("NNN" plus designator) are optional.
+ Minutes and seconds may optionally be represented as NNN:NNN.
+ Also, hours, minute and seconds may be represented as NNN:NNN:NNN.
+ There is no limitation on the value of any of the terms, except
+ that the final result must fit in a time_t value.
+
+ ==== if it is a 'P' or 'T', please see ISO-8601 for a rigorous definition.
+
+ The 'P' term may be followed by any of three formats:
+ yyyymmdd
+ yy-mm-dd
+ yy Y mm M ww W dd D
+
+ or it may be empty and followed by a 'T'. The "yyyymmdd" must be eight
+ digits long. Note: months are always 30 days and years are always 365
+ days long. 5 years is always 1825, not 1826 or 1827 depending on leap
+ year considerations. 3 months is always 90 days. There is no consideration
+ for how many days are in the current, next or previous months.
+
+ For the final format:
+ * Embedded white space is allowed, but it is optional.
+ * All of the terms are optional. Any or all-but-one may be omitted.
+ * The meanings are yy years, mm months, ww weeks and dd days.
+ * The terms must appear in this order.
+
+ ==== The 'T' term may be followed by any of these formats:
+
+ hhmmss
+ hh:mm:ss
+ hh H mm M ss S
+
+ For the final format:
+ * Embedded white space is allowed, but it is optional.
+ * All of the terms are optional. Any or all-but-one may be omitted.
+ * The terms must appear in this order.
+
+ */
+#ifndef GNULIB_PARSE_DURATION_H
+#define GNULIB_PARSE_DURATION_H
+
+#include <time.h>
+
+#define BAD_TIME ((time_t)~0)
+
+extern time_t parse_duration(char const * in_pz);
+
+#endif /* GNULIB_PARSE_DURATION_H */
/*
- * $Id: pgusage.c,v 4.12 2007/04/28 22:19:23 bkorb Exp $
- * Time-stamp: "2006-07-16 08:13:26 bkorb"
+ * $Id: pgusage.c,v 4.17 2009/01/01 16:51:49 bkorb Exp $
+ * Time-stamp: "2008-07-27 21:08:42 bkorb"
*
* Automated Options Paged Usage module.
*
* This routine will run run-on options through a pager so the
* user may examine, print or edit them at their leisure.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
*
- * Automated Options 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.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * These files have the following md5sums:
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
tePagerState pagerState = PAGER_STATE_INITIAL;
optionPagedUsage( tOptions* pOptions, tOptDesc* pOD )
{
#if defined(__windows__) && !defined(__CYGWIN__)
+ if ((pOD->fOptState & OPTST_RESET) != 0)
+ return;
+
(*pOptions->pUsageProc)( pOptions, EXIT_SUCCESS );
#else
static pid_t my_pid;
switch (pagerState) {
case PAGER_STATE_INITIAL:
{
+ if ((pOD->fOptState & OPTST_RESET) != 0)
+ return;
+
my_pid = getpid();
#ifdef HAVE_SNPRINTF
snprintf(zPageUsage, sizeof(zPageUsage), "/tmp/use.%lu", (tAoUL)my_pid);
/* -*- buffer-read-only: t -*- vi: set ro:
*
* Prototypes for autoopts
- * Generated Sat May 5 12:02:36 PDT 2007
+ * Generated Sat May 16 08:15:54 PDT 2009
*/
#ifndef AUTOOPTS_PROTO_H_GUARD
#define AUTOOPTS_PROTO_H_GUARD 1
+
#ifndef LOCAL
# define LOCAL extern
# define REDEF_LOCAL 1
#else
# undef REDEF_LOCAL
#endif
-/*\n * Extracted from autoopts.c\n */
+/*
+ * Extracted from autoopts.c
+ */
LOCAL void *
ao_malloc( size_t sz );
LOCAL tSuccess
doRegularOpts( tOptions* pOpts );
-/*\n * Extracted from configfile.c\n */
+/*
+ * Extracted from configfile.c
+ */
LOCAL void
internalFileLoad( tOptions* pOpts );
LOCAL tSuccess
validateOptionsStruct( tOptions* pOpts, char const* pzProgram );
-/*\n * Extracted from environment.c\n */
+/*
+ * Extracted from environment.c
+ */
LOCAL void
doPrognameEnv( tOptions* pOpts, teEnvPresetType type );
LOCAL void
doEnvPresets( tOptions* pOpts, teEnvPresetType type );
-/*\n * Extracted from load.c\n */
+/*
+ * Extracted from load.c
+ */
LOCAL void
mungeString( char* pzTxt, tOptionLoadMode mode );
tDirection direction,
tOptionLoadMode load_mode );
-/*\n * Extracted from nested.c\n */
+/*
+ * Extracted from nested.c
+ */
LOCAL tOptionValue*
optionLoadNested(char const* pzTxt, char const* pzName, size_t nameLen);
-/*\n * Extracted from sort.c\n */
+LOCAL int
+get_special_char(char const ** ppz, int * ct);
+
+LOCAL void
+emit_special_char(FILE * fp, int ch);
+
+/*
+ * Extracted from sort.c
+ */
LOCAL void
optionSort( tOptions* pOpts );
-/*\n * Extracted from stack.c\n */
+/*
+ * Extracted from stack.c
+ */
LOCAL void
addArgListEntry( void** ppAL, void* entry );
/*
- * $Id: putshell.c,v 4.18 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2007-01-13 10:29:39 bkorb"
+ * $Id: putshell.c,v 4.26 2009/01/01 16:51:49 bkorb Exp $
+ * Time-stamp: "2008-07-27 12:14:38 bkorb"
*
* This module will interpret the options set in the tOptions
* structure and print them to standard out in a fashion that
* will allow them to be interpreted by the Bourne or Korn shells.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
*
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * Automated Options 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.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * These files have the following md5sums:
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
- *
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static void
putQuotedStr( tCC* pzStr );
/* = = = END-STATIC-FORWARD = = = */
printf( zOptNumFmt, pOpts->pzPROGNAME, pOD->pz_NAME,
(int)(uintptr_t)(pOD->optCookie) );
pOD->optCookie = (void*)(uintptr_t)~0UL;
- (*(pOD->pOptProc))( (tOptions*)2UL, pOD );
+ (*(pOD->pOptProc))(OPTPROC_RETURN_VALNAME, pOD);
/*
* We are building the typeset list. The list returned starts with
pz = pOD->optArg.argString + 7;
while (*pz != NUL) {
printf( "typeset -x -i %s_", pOD->pz_NAME );
- pz += strspn( pz, " +\t\n\f" );
+ while (IS_PLUS_N_SPACE_CHAR(*pz)) pz++;
+
for (;;) {
- int ch = *(pz++);
- if (islower( ch )) fputc( toupper( ch ), stdout );
- else if (isalnum( ch )) fputc( ch, stdout );
- else if (isspace( ch )
- || (ch == '+')) goto name_done;
- else if (ch == NUL) { pz--; goto name_done; }
- else fputc( '_', stdout );
+ int ch = *(pz++);
+ if (IS_LOWER_CASE_CHAR(ch)) fputc(toupper(ch), stdout);
+ else if (IS_UPPER_CASE_CHAR(ch)) fputc(ch, stdout);
+ else if (IS_PLUS_N_SPACE_CHAR(ch)) goto name_done;
+ else if (ch == NUL) { pz--; goto name_done; }
+ else fputc( '_', stdout );
} name_done:;
printf( "=%1$lu # 0x%1$lX\n", (unsigned long)val );
val <<= 1;
* to emit the value corresponding to the "optArg" number.
*/
else if (OPTST_GET_ARGTYPE(pOD->fOptState) == OPARG_TYPE_ENUMERATION) {
+ uintptr_t e_val = pOD->optArg.argEnum;
printf( zOptValFmt, pOpts->pzPROGNAME, pOD->pz_NAME );
- fputc( '\'', stdout );
- (*(pOD->pOptProc))( (tOptions*)1UL, pOD );
- fputc( '\'', stdout );
- printf( zOptEnd, pOpts->pzPROGNAME, pOD->pz_NAME );
+
+ /*
+ * Convert value to string, print that and restore numeric value.
+ */
+ (*(pOD->pOptProc))(OPTPROC_RETURN_VALNAME, pOD);
+ printf("'%s'", pOD->optArg.argString);
+ if (pOD->fOptState & OPTST_ALLOC_ARG)
+ AGFREE(pOD->optArg.argString);
+ pOD->optArg.argEnum = e_val;
+
+ printf(zOptEnd, pOpts->pzPROGNAME, pOD->pz_NAME);
}
/*
--- /dev/null
+
+/*
+ * $Id: reset.c,v 4.3 2009/01/01 16:51:49 bkorb Exp $
+ * Time-stamp: "2008-08-02 12:25:18 bkorb"
+ *
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
+ *
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
+ *
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
+ *
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
+ *
+ * These files have the following md5sums:
+ *
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
+ */
+
+static void
+optionReset( tOptions* pOpts, tOptDesc* pOD )
+{
+ pOD->fOptState &= OPTST_PERSISTENT_MASK;
+ pOD->fOptState |= OPTST_RESET;
+ if (pOD->pOptProc != NULL)
+ pOD->pOptProc(pOpts, pOD);
+ pOD->optArg.argString =
+ pOpts->originalOptArgArray[ pOD->optIndex ].argString;
+ pOD->optCookie = pOpts->originalOptArgCookie[ pOD->optIndex ];
+ pOD->fOptState &= OPTST_PERSISTENT_MASK;
+}
+
+
+static void
+optionResetEverything(tOptions * pOpts)
+{
+ tOptDesc * pOD = pOpts->pOptDesc;
+ int ct = pOpts->presetOptCt;
+
+ for (;;) {
+ optionReset(pOpts, pOD);
+
+ if (--ct <= 0)
+ break;
+ pOD++;
+ }
+}
+
+
+/*=export_func optionResetOpt
+ * private:
+ *
+ * what: Reset the value of an option
+ * arg: + tOptions* + pOpts + program options descriptor +
+ * arg: + tOptDesc* + pOptDesc + the descriptor for this arg +
+ *
+ * doc:
+ * This code will cause another option to be reset to its initial state.
+ * For example, --reset=foo will cause the --foo option to be reset.
+=*/
+void
+optionResetOpt( tOptions* pOpts, tOptDesc* pOD )
+{
+ static ag_bool reset_active = AG_FALSE;
+
+ tOptState opt_state = OPTSTATE_INITIALIZER(DEFINED);
+ char const * pzArg = pOD->optArg.argString;
+ tSuccess succ;
+
+ if (reset_active)
+ return;
+
+ if ( (! HAS_originalOptArgArray(pOpts))
+ || (pOpts->originalOptArgCookie == NULL)) {
+ fputs(zResetNotConfig, stderr);
+ _exit(EX_SOFTWARE);
+ }
+
+ if ((pzArg == NULL) || (*pzArg == NUL)) {
+ fputs(zNoResetArg, stderr);
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ }
+
+ reset_active = AG_TRUE;
+
+ if (pzArg[1] == NUL) {
+ if (*pzArg == '*') {
+ optionResetEverything(pOpts);
+ reset_active = AG_FALSE;
+ return;
+ }
+
+ succ = shortOptionFind(pOpts, (tAoUC)*pzArg, &opt_state);
+ if (! SUCCESSFUL(succ)) {
+ fprintf(stderr, zIllOptChr, pOpts->pzProgPath, *pzArg);
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ }
+ } else {
+ succ = longOptionFind(pOpts, (char *)pzArg, &opt_state);
+ if (! SUCCESSFUL(succ)) {
+ fprintf(stderr, zIllOptStr, pOpts->pzProgPath, pzArg);
+ pOpts->pUsageProc(pOpts, EXIT_FAILURE);
+ }
+ }
+
+ /*
+ * We've found the indicated option. Turn off all non-persistent
+ * flags because we're forcing the option back to its initialized state.
+ * Call any callout procedure to handle whatever it needs to.
+ * Finally, clear the reset flag, too.
+ */
+ optionReset(pOpts, opt_state.pOD);
+ reset_active = AG_FALSE;
+}
+/*
+ * Local Variables:
+ * mode: C
+ * c-file-style: "stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * end of autoopts/reset.c */
/*
- * restore.c $Id: restore.c,v 4.10 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2007-01-13 14:13:17 bkorb"
+ * restore.c $Id: restore.c,v 4.14 2009/01/01 16:51:49 bkorb Exp $
+ * Time-stamp: "2007-07-04 11:34:40 bkorb"
*
* This module's routines will save the current option state to memory
* and restore it. If saved prior to the initial optionProcess call,
* then the initial state will be restored.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
- *
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
- *
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
- *
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ *
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
+ *
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
+ *
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
+ *
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
+ *
+ * These files have the following md5sums:
+ *
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
/*
/*
- * save.c $Id: save.c,v 4.18 2007/04/15 19:01:18 bkorb Exp $
- * Time-stamp: "2007-04-15 11:11:10 bkorb"
+ * save.c $Id: save.c,v 4.29 2009/01/01 16:51:49 bkorb Exp $
+ * Time-stamp: "2008-09-23 14:24:58 bkorb"
*
* This module's routines will take the currently set options and
* store them into an ".rc" file for re-interpretation the next
* time the invoking program is run.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
*
- * Automated Options 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.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * These files have the following md5sums:
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
-tSCC zWarn[] = "%s WARNING: cannot save options - ";
+static char const zWarn[] = "%s WARNING: cannot save options - ";
+static char const close_xml[] = "</%s>\n";
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static tCC*
findDirName( tOptions* pOpts, int* p_free );
FILE * fp,
tOptDesc * p,
tCC* pzLA );
+
+static void
+print_a_value(FILE * fp, int depth, tOptDesc * pOD, tOptionValue const * ovp);
+
+static void
+print_a_string(FILE * fp, char const * name, char const * pz);
+
+static void
+printValueList(FILE * fp, char const * name, tArgList * al);
+
+static void
+printHierarchy(FILE * fp, tOptDesc * p);
+
+static FILE *
+openSaveFile( tOptions* pOpts );
+
+static void
+printNoArgOpt(FILE * fp, tOptDesc * p, tOptDesc * pOD);
+
+static void
+printStringArg(FILE * fp, tOptDesc * pOD);
+
+static void
+printEnumArg(FILE * fp, tOptDesc * pOD);
+
+static void
+printSetMemberArg(FILE * fp, tOptDesc * pOD);
+
+static void
+printFileArg(FILE * fp, tOptDesc * pOD, tOptions* pOpts);
/* = = = END-STATIC-FORWARD = = = */
static tCC*
}
-/*=export_func optionSaveFile
- *
- * what: saves the option state to a file
- *
- * arg: tOptions*, pOpts, program options descriptor
- *
- * doc:
- *
- * This routine will save the state of option processing to a file. The name
- * of that file can be specified with the argument to the @code{--save-opts}
- * option, or by appending the @code{rcfile} attribute to the last
- * @code{homerc} attribute. If no @code{rcfile} attribute was specified, it
- * will default to @code{.@i{programname}rc}. If you wish to specify another
- * file, you should invoke the @code{SET_OPT_SAVE_OPTS( @i{filename} )} macro.
- *
- * err:
- *
- * If no @code{homerc} file was specified, this routine will silently return
- * and do nothing. If the output file cannot be created or updated, a message
- * will be printed to @code{stderr} and the routine will return.
-=*/
-void
-optionSaveFile( tOptions* pOpts )
+static void
+print_a_value(FILE * fp, int depth, tOptDesc * pOD, tOptionValue const * ovp)
+{
+ static char const bool_atr[] = "<%1$s type=boolean>%2$s</%1$s>\n";
+ static char const numb_atr[] = "<%1$s type=integer>0x%2$lX</%1$s>\n";
+ static char const type_atr[] = "<%s type=%s>";
+ static char const null_atr[] = "<%s/>\n";
+
+ while (--depth >= 0)
+ putc(' ', fp), putc(' ', fp);
+
+ switch (ovp->valType) {
+ default:
+ case OPARG_TYPE_NONE:
+ fprintf(fp, null_atr, ovp->pzName);
+ break;
+
+ case OPARG_TYPE_STRING:
+ print_a_string(fp, ovp->pzName, ovp->v.strVal);
+ break;
+
+ case OPARG_TYPE_ENUMERATION:
+ case OPARG_TYPE_MEMBERSHIP:
+ if (pOD != NULL) {
+ tAoUI opt_state = pOD->fOptState;
+ uintptr_t val = pOD->optArg.argEnum;
+ char const * typ = (ovp->valType == OPARG_TYPE_ENUMERATION)
+ ? "keyword" : "set-membership";
+
+ fprintf(fp, type_atr, ovp->pzName, typ);
+
+ /*
+ * This is a magic incantation that will convert the
+ * bit flag values back into a string suitable for printing.
+ */
+ (*(pOD->pOptProc))(OPTPROC_RETURN_VALNAME, pOD );
+ if (pOD->optArg.argString != NULL) {
+ fputs(pOD->optArg.argString, fp);
+
+ if (ovp->valType != OPARG_TYPE_ENUMERATION) {
+ /*
+ * set membership strings get allocated
+ */
+ AGFREE( (void*)pOD->optArg.argString );
+ }
+ }
+
+ pOD->optArg.argEnum = val;
+ pOD->fOptState = opt_state;
+ fprintf(fp, close_xml, ovp->pzName);
+ break;
+ }
+ /* FALLTHROUGH */
+
+ case OPARG_TYPE_NUMERIC:
+ fprintf(fp, numb_atr, ovp->pzName, ovp->v.longVal);
+ break;
+
+ case OPARG_TYPE_BOOLEAN:
+ fprintf(fp, bool_atr, ovp->pzName,
+ ovp->v.boolVal ? "true" : "false");
+ break;
+
+ case OPARG_TYPE_HIERARCHY:
+ printValueList(fp, ovp->pzName, ovp->v.nestVal);
+ break;
+ }
+}
+
+
+static void
+print_a_string(FILE * fp, char const * name, char const * pz)
+{
+ static char const open_atr[] = "<%s>";
+
+ fprintf(fp, open_atr, name);
+ for (;;) {
+ int ch = ((int)*(pz++)) & 0xFF;
+
+ switch (ch) {
+ case NUL: goto string_done;
+
+ case '&':
+ case '<':
+ case '>':
+#if __GNUC__ >= 4
+ case 1 ... (' ' - 1):
+ case ('~' + 1) ... 0xFF:
+#endif
+ emit_special_char(fp, ch);
+ break;
+
+ default:
+#if __GNUC__ < 4
+ if ( ((ch >= 1) && (ch <= (' ' - 1)))
+ || ((ch >= ('~' + 1)) && (ch <= 0xFF)) ) {
+ emit_special_char(fp, ch);
+ break;
+ }
+#endif
+ putc(ch, fp);
+ }
+ } string_done:;
+ fprintf(fp, close_xml, name);
+}
+
+
+static void
+printValueList(FILE * fp, char const * name, tArgList * al)
+{
+ static int depth = 1;
+
+ int sp_ct;
+ int opt_ct;
+ void ** opt_list;
+
+ if (al == NULL)
+ return;
+ opt_ct = al->useCt;
+ opt_list = (void **)al->apzArgs;
+
+ if (opt_ct <= 0) {
+ fprintf(fp, "<%s/>\n", name);
+ return;
+ }
+
+ fprintf(fp, "<%s type=nested>\n", name);
+
+ depth++;
+ while (--opt_ct >= 0) {
+ tOptionValue const * ovp = *(opt_list++);
+
+ print_a_value(fp, depth, NULL, ovp);
+ }
+ depth--;
+
+ for (sp_ct = depth; --sp_ct >= 0;)
+ putc(' ', fp), putc(' ', fp);
+ fprintf(fp, "</%s>\n", name);
+}
+
+
+static void
+printHierarchy(FILE * fp, tOptDesc * p)
+{
+ int opt_ct;
+ tArgList * al = p->optCookie;
+ void ** opt_list;
+
+ if (al == NULL)
+ return;
+
+ opt_ct = al->useCt;
+ opt_list = (void **)al->apzArgs;
+
+ if (opt_ct <= 0)
+ return;
+
+ do {
+ tOptionValue const * base = *(opt_list++);
+ tOptionValue const * ovp = optionGetValue(base, NULL);
+
+ if (ovp == NULL)
+ continue;
+
+ fprintf(fp, "<%s type=nested>\n", p->pz_Name);
+
+ do {
+ print_a_value(fp, 1, p, ovp);
+
+ } while (ovp = optionNextValue(base, ovp),
+ ovp != NULL);
+
+ fprintf(fp, "</%s>\n", p->pz_Name);
+ } while (--opt_ct > 0);
+}
+
+
+static FILE *
+openSaveFile( tOptions* pOpts )
{
- tOptDesc* pOD;
- int ct;
FILE* fp;
{
int free_name = 0;
tCC* pzFName = findFileName( pOpts, &free_name );
if (pzFName == NULL)
- return;
+ return NULL;
fp = fopen( pzFName, "w" FOPEN_BINARY_FLAG );
if (fp == NULL) {
fprintf( stderr, zNoCreat, errno, strerror( errno ), pzFName );
if (free_name)
AGFREE((void*) pzFName );
- return;
+ return fp;
}
if (free_name)
#endif
}
+ return fp;
+}
+
+static void
+printNoArgOpt(FILE * fp, tOptDesc * p, tOptDesc * pOD)
+{
+ /*
+ * The aliased to argument indicates whether or not the option
+ * is "disabled". However, the original option has the name
+ * string, so we get that there, not with "p".
+ */
+ char const * pznm =
+ (DISABLED_OPT( p )) ? pOD->pz_DisableName : pOD->pz_Name;
+ /*
+ * If the option was disabled and the disablement name is NULL,
+ * then the disablement was caused by aliasing.
+ * Use the name as the string to emit.
+ */
+ if (pznm == NULL)
+ pznm = pOD->pz_Name;
+
+ fprintf(fp, "%s\n", pznm);
+}
+
+static void
+printStringArg(FILE * fp, tOptDesc * pOD)
+{
+ if (pOD->fOptState & OPTST_STACKED) {
+ tArgList* pAL = (tArgList*)pOD->optCookie;
+ int uct = pAL->useCt;
+ tCC** ppz = pAL->apzArgs;
+
+ /*
+ * un-disable multiple copies of disabled options.
+ */
+ if (uct > 1)
+ pOD->fOptState &= ~OPTST_DISABLED;
+
+ while (uct-- > 0)
+ printEntry( fp, pOD, *(ppz++) );
+ } else {
+ printEntry( fp, pOD, pOD->optArg.argString );
+ }
+}
+
+static void
+printEnumArg(FILE * fp, tOptDesc * pOD)
+{
+ uintptr_t val = pOD->optArg.argEnum;
+
+ /*
+ * This is a magic incantation that will convert the
+ * bit flag values back into a string suitable for printing.
+ */
+ (*(pOD->pOptProc))(OPTPROC_RETURN_VALNAME, pOD);
+ printEntry( fp, pOD, (void*)(pOD->optArg.argString));
+
+ pOD->optArg.argEnum = val;
+}
+
+static void
+printSetMemberArg(FILE * fp, tOptDesc * pOD)
+{
+ uintptr_t val = pOD->optArg.argEnum;
+
+ /*
+ * This is a magic incantation that will convert the
+ * bit flag values back into a string suitable for printing.
+ */
+ (*(pOD->pOptProc))(OPTPROC_RETURN_VALNAME, pOD);
+ printEntry( fp, pOD, (void*)(pOD->optArg.argString));
+
+ if (pOD->optArg.argString != NULL) {
+ /*
+ * set membership strings get allocated
+ */
+ AGFREE( (void*)pOD->optArg.argString );
+ pOD->fOptState &= ~OPTST_ALLOC_ARG;
+ }
+
+ pOD->optArg.argEnum = val;
+}
+
+static void
+printFileArg(FILE * fp, tOptDesc * pOD, tOptions* pOpts)
+{
+ /*
+ * If the cookie is not NULL, then it has the file name, period.
+ * Otherwise, if we have a non-NULL string argument, then....
+ */
+ if (pOD->optCookie != NULL)
+ printEntry(fp, pOD, pOD->optCookie);
+
+ else if (HAS_originalOptArgArray(pOpts)) {
+ char const * orig =
+ pOpts->originalOptArgArray[pOD->optIndex].argString;
+
+ if (pOD->optArg.argString == orig)
+ return;
+
+ printEntry(fp, pOD, pOD->optArg.argString);
+ }
+}
+
+
+/*=export_func optionSaveFile
+ *
+ * what: saves the option state to a file
+ *
+ * arg: tOptions*, pOpts, program options descriptor
+ *
+ * doc:
+ *
+ * This routine will save the state of option processing to a file. The name
+ * of that file can be specified with the argument to the @code{--save-opts}
+ * option, or by appending the @code{rcfile} attribute to the last
+ * @code{homerc} attribute. If no @code{rcfile} attribute was specified, it
+ * will default to @code{.@i{programname}rc}. If you wish to specify another
+ * file, you should invoke the @code{SET_OPT_SAVE_OPTS( @i{filename} )} macro.
+ *
+ * The recommend usage is as follows:
+ * @example
+ * optionProcess(&progOptions, argc, argv);
+ * if (i_want_a_non_standard_place_for_this)
+ * SET_OPT_SAVE_OPTS("myfilename");
+ * optionSaveFile(&progOptions);
+ * @end example
+ *
+ * err:
+ *
+ * If no @code{homerc} file was specified, this routine will silently return
+ * and do nothing. If the output file cannot be created or updated, a message
+ * will be printed to @code{stderr} and the routine will return.
+=*/
+void
+optionSaveFile( tOptions* pOpts )
+{
+ tOptDesc* pOD;
+ int ct;
+ FILE* fp = openSaveFile(pOpts);
+
+ if (fp == NULL)
+ return;
+
/*
* FOR each of the defined options, ...
*/
ct = pOpts->presetOptCt;
pOD = pOpts->pOptDesc;
do {
- int arg_state;
tOptDesc* p;
/*
* OR it does not take an initialization value
* OR it is equivalenced to another option
* THEN continue (ignore it)
+ *
+ * Equivalenced options get picked up when the equivalenced-to
+ * option is processed.
*/
if (UNUSED_OPT( pOD ))
continue;
- if ((pOD->fOptState & (OPTST_NO_INIT|OPTST_DOCUMENT|OPTST_OMITTED))
- != 0)
+ if ((pOD->fOptState & OPTST_DO_NOT_SAVE_MASK) != 0)
continue;
if ( (pOD->optEquivIndex != NO_EQUIVALENT)
- && (pOD->optEquivIndex != pOD->optIndex))
+ && (pOD->optEquivIndex != pOD->optIndex))
continue;
/*
- * Set a temporary pointer to the real option description
- * (i.e. account for equivalencing)
+ * The option argument data are found at the equivalenced-to option,
+ * but the actual option argument type comes from the original
+ * option descriptor. Be careful!
*/
p = ((pOD->fOptState & OPTST_EQUIVALENCE) != 0)
? (pOpts->pOptDesc + pOD->optActualIndex) : pOD;
- /*
- * IF no arguments are allowed
- * THEN just print the name and continue
- */
- if (OPTST_GET_ARGTYPE(pOD->fOptState) == OPARG_TYPE_NONE) {
- char const * pznm =
- (DISABLED_OPT( p )) ? p->pz_DisableName : p->pz_Name;
- /*
- * If the option was disabled and the disablement name is NULL,
- * then the disablement was caused by aliasing.
- * Use the name as the string to emit.
- */
- if (pznm == NULL)
- pznm = p->pz_Name;
-
- fprintf(fp, "%s\n", pznm);
- continue;
- }
+ switch (OPTST_GET_ARGTYPE(pOD->fOptState)) {
+ case OPARG_TYPE_NONE:
+ printNoArgOpt(fp, p, pOD);
+ break;
- arg_state = OPTST_GET_ARGTYPE(p->fOptState);
- switch (arg_state) {
- case 0:
case OPARG_TYPE_NUMERIC:
printEntry( fp, p, (void*)(p->optArg.argInt));
break;
case OPARG_TYPE_STRING:
- if (p->fOptState & OPTST_STACKED) {
- tArgList* pAL = (tArgList*)p->optCookie;
- int uct = pAL->useCt;
- tCC** ppz = pAL->apzArgs;
-
- /*
- * Disallow multiple copies of disabled options.
- */
- if (uct > 1)
- p->fOptState &= ~OPTST_DISABLED;
-
- while (uct-- > 0)
- printEntry( fp, p, *(ppz++) );
- } else {
- printEntry( fp, p, p->optArg.argString );
- }
+ printStringArg(fp, p);
break;
case OPARG_TYPE_ENUMERATION:
- case OPARG_TYPE_MEMBERSHIP:
- {
- uintptr_t val = p->optArg.argEnum;
- /*
- * This is a magic incantation that will convert the
- * bit flag values back into a string suitable for printing.
- */
- (*(p->pOptProc))( (tOptions*)2UL, p );
- printEntry( fp, p, (void*)(p->optArg.argString));
-
- if ( (p->optArg.argString != NULL)
- && (arg_state != OPARG_TYPE_ENUMERATION)) {
- /*
- * set membership strings get allocated
- */
- AGFREE( (void*)p->optArg.argString );
- p->fOptState &= ~OPTST_ALLOC_ARG;
- }
+ printEnumArg(fp, p);
+ break;
- p->optArg.argEnum = val;
+ case OPARG_TYPE_MEMBERSHIP:
+ printSetMemberArg(fp, p);
break;
- }
case OPARG_TYPE_BOOLEAN:
printEntry( fp, p, p->optArg.argBool ? "true" : "false" );
break;
+ case OPARG_TYPE_HIERARCHY:
+ printHierarchy(fp, p);
+ break;
+
+ case OPARG_TYPE_FILE:
+ printFileArg(fp, p, pOpts);
+ break;
+
default:
break; /* cannot handle - skip it */
}
/*
- * sort.c $Id: sort.c,v 4.10 2007/04/28 22:19:23 bkorb Exp $
- * Time-stamp: "2006-10-18 11:29:04 bkorb"
+ * sort.c $Id: sort.c,v 4.15 2009/01/01 16:51:49 bkorb Exp $
+ * Time-stamp: "2007-07-04 11:34:52 bkorb"
*
* This module implements argument sorting.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
+ * These files have the following md5sums:
*
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static tSuccess
mustHandleArg( tOptions* pOpts, char* pzArg, tOptState* pOS,
char** ppzOpts, int* pOptsIdx );
/*
* stack.c
- * $Id: stack.c,v 4.13 2007/02/04 17:44:12 bkorb Exp $
- * Time-stamp: "2007-01-13 10:43:21 bkorb"
+ * $Id: stack.c,v 4.18 2009/01/01 16:51:49 bkorb Exp $
+ * Time-stamp: "2008-07-30 16:56:32 bkorb"
*
* This is a special option processing routine that will save the
* argument to an option in a FIFO queue.
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
*
- * Automated Options 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.
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * These files have the following md5sums:
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
#ifdef WITH_LIBREGEX
{
int res;
- tArgList* pAL = (tArgList*)pOptDesc->optCookie;
+ tArgList* pAL;
+
+ if ((pOptDesc->fOptState & OPTST_RESET) != 0)
+ return;
+ pAL = (tArgList*)pOptDesc->optCookie;
+
/*
* IF we don't have any stacked options,
* THEN indicate that we don't have any of these options
{
char * pz;
- if (pOD->optArg.argString == NULL)
- return;
+ if ((pOD->fOptState & OPTST_RESET) != 0) {
+ tArgList* pAL = (void*)pOD->optCookie;
+ int ix;
+ if (pAL == NULL)
+ return;
+
+ ix = pAL->useCt;
+ while (--ix >= 0)
+ AGFREE(pAL->apzArgs[ix]);
+ AGFREE(pAL);
- AGDUPSTR(pz, pOD->optArg.argString, "stack arg");
- addArgListEntry( &(pOD->optCookie), (void*)pz );
+ } else {
+ if (pOD->optArg.argString == NULL)
+ return;
+
+ AGDUPSTR(pz, pOD->optArg.argString, "stack arg");
+ addArgListEntry( &(pOD->optCookie), (void*)pz );
+ }
}
/*
* Local Variables:
/*
- * $Id: streqvcmp.c,v 4.10 2007/04/28 22:19:23 bkorb Exp $
- * Time-stamp: "2006-07-26 18:25:53 bkorb"
+ * $Id: streqvcmp.c,v 4.15 2009/01/01 16:51:49 bkorb Exp $
+ * Time-stamp: "2008-12-26 10:15:46 bkorb"
*
* String Equivalence Comparison
*
* character before comparison. In processing long option names,
* the characters "-", "_" and "^" all need to be equivalent
* (because they are treated so by different development environments).
- */
-
-/*
- * Automated Options copyright 1992-2007 Bruce Korb
- *
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
- *
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
- *
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
- *
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
- */
-
-/*
+ *
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
+ *
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
+ *
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
+ *
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
+ *
+ * These files have the following md5sums:
+ *
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
+ *
* This array is designed for mapping upper and lower case letter
* together for a case independent comparison. The mappings are
* based upon ascii character sequences.
* This function name is mapped to option_strtransform so as to not conflict
* with the POSIX name space.
*
+ * The source and destination may be the same.
+ *
* err: none.
=*/
void
/*
- * $Id: text_mmap.c,v 4.15 2006/11/27 01:52:23 bkorb Exp $
+ * $Id: text_mmap.c,v 4.19 2009/01/01 16:51:49 bkorb Exp $
*
- * Time-stamp: "2006-09-10 14:50:04 bkorb"
+ * Time-stamp: "2007-07-04 11:35:49 bkorb"
+ *
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
+ *
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
+ *
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
+ *
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
+ *
+ * These files have the following md5sums:
+ *
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
#ifndef MAP_ANONYMOUS
--- /dev/null
+
+/*
+ * $Id: time.c,v 4.3 2009/01/01 16:51:50 bkorb Exp $
+ * Time-stamp: "2008-11-16 14:51:48 bkorb"
+ *
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
+ *
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
+ *
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
+ *
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
+ *
+ * These files have the following md5sums:
+ *
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
+ */
+
+#ifndef HAVE_PARSE_DURATION
+#include <time.h>
+
+static inline char *
+ao_xstrdup(char const * pz)
+{
+ char * str;
+ AGDUPSTR(str, pz, "time val str");
+ return str;
+}
+
+#define xstrdup(_s) ao_xstrdup(_s)
+
+#include "parse-duration.c"
+
+#undef xstrdup
+#endif
+
+/*=export_func optionTimeVal
+ * private:
+ *
+ * what: process an option with a time value.
+ * arg: + tOptions* + pOpts + program options descriptor +
+ * arg: + tOptDesc* + pOptDesc + the descriptor for this arg +
+ *
+ * doc:
+ * Decipher a time duration value.
+=*/
+void
+optionTimeVal(tOptions* pOpts, tOptDesc* pOD )
+{
+ long val;
+
+ if ((pOD->fOptState & OPTST_RESET) != 0)
+ return;
+
+ val = parse_duration(pOD->optArg.argString);
+ if (errno != 0)
+ goto bad_time;
+
+ if (pOD->fOptState & OPTST_ALLOC_ARG) {
+ AGFREE(pOD->optArg.argString);
+ pOD->fOptState &= ~OPTST_ALLOC_ARG;
+ }
+
+ pOD->optArg.argInt = val;
+ return;
+
+bad_time:
+ fprintf( stderr, zNotNumber, pOpts->pzProgName, pOD->optArg.argString );
+ if ((pOpts->fOptSet & OPTPROC_ERRSTOP) != 0)
+ (*(pOpts->pUsageProc))(pOpts, EXIT_FAILURE);
+
+ pOD->optArg.argInt = ~0;
+}
+/*
+ * Local Variables:
+ * mode: C
+ * c-file-style: "stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * end of autoopts/numeric.c */
/*
* This file defines the string_tokenize interface
- * Time-stamp: "2006-06-24 15:27:49 bkorb"
+ * Time-stamp: "2007-11-12 20:40:36 bkorb"
*
- * string_tokenize copyright 2005 Bruce Korb
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * string_tokenize is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * string_tokenize 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
- * Lesser General Public License for more details.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with string_tokenize; if not, write to:
- * The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
+ *
+ * These files have the following md5sums:
+ *
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
-#include <ctype.h>
+
#include <errno.h>
#include <stdlib.h>
#define ch_t unsigned char
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static void
copy_cooked( ch_t** ppDest, char const ** ppSrc );
* Trim leading white space. Use "ENOENT" and a NULL return to indicate
* an empty string was passed.
*/
- while (isspace( (ch_t)*str )) str++;
+ while (IS_WHITESPACE_CHAR(*str)) str++;
if (*str == NUL) {
bogus_str:
errno = ENOENT;
do {
max_token_ct++;
- while (! isspace( *++pz ))
+ while (! IS_WHITESPACE_CHAR(*++pz))
if (*pz == NUL) goto found_nul;
- while (isspace( *pz )) pz++;
+ while (IS_WHITESPACE_CHAR(*pz)) pz++;
} while (*pz != NUL);
found_nul:
res->tkn_list[ res->tkn_ct++ ] = pzDest;
for (;;) {
int ch = (ch_t)*str;
- if (isspace( ch )) {
+ if (IS_WHITESPACE_CHAR(ch)) {
found_white_space:
- while (isspace( (ch_t)*++str )) ;
+ while (IS_WHITESPACE_CHAR(*++str)) ;
break;
}
errno = EINVAL;
return NULL;
}
- if (isspace( (ch_t)*str ))
+ if (IS_WHITESPACE_CHAR(*str))
goto found_white_space;
break;
errno = EINVAL;
return NULL;
}
- if (isspace( (ch_t)*str ))
+ if (IS_WHITESPACE_CHAR(*str))
goto found_white_space;
break;
/*
- * usage.c $Id: usage.c,v 4.15 2007/04/28 22:19:23 bkorb Exp $
- * Time-stamp: "2007-04-15 11:02:46 bkorb"
+ * usage.c $Id: usage.c,v 4.30 2009/01/17 22:08:07 bkorb Exp $
+ * Time-stamp: "2009-01-17 13:18:23 bkorb"
*
* This module implements the default usage procedure for
* Automated Options. It may be overridden, of course.
*/
/*
- * Automated Options copyright 1992-2007 Bruce Korb
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * Automated Options 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.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * You should have received a copy of the GNU General Public License
- * along with Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * These files have the following md5sums:
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
- *
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
- *
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
- *
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
#define OPTPROC_L_N_S (OPTPROC_LONGOPT | OPTPROC_SHORTOPT)
static ag_bool displayEnum;
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static ag_bool
checkGNUUsage( tOptions* pOpts );
* Paged usage will preset option_usage_fp to an output file.
* If it hasn't already been set, then set it to standard output
* on successful exit (help was requested), otherwise error out.
+ *
+ * Test the version before obtaining pzFullUsage or pzShortUsage.
+ * These fields do not exist before revision 30.
*/
- if (option_usage_fp == NULL)
- option_usage_fp = (actual_exit_code != EXIT_SUCCESS) ? stderr : stdout;
+ {
+ char const * pz;
+
+ if (actual_exit_code == EXIT_SUCCESS) {
+ pz = (pOptions->structVersion >= 30 * 4096)
+ ? pOptions->pzFullUsage : NULL;
+
+ if (option_usage_fp == NULL)
+ option_usage_fp = stdout;
+ } else {
+ pz = (pOptions->structVersion >= 30 * 4096)
+ ? pOptions->pzShortUsage : NULL;
+
+ if (option_usage_fp == NULL)
+ option_usage_fp = stderr;
+ }
+
+ if (pz != NULL) {
+ fputs(pz, option_usage_fp);
+ exit(actual_exit_code);
+ }
+ }
fprintf( option_usage_fp, pOptions->pzUsageTitle, pOptions->pzProgName );
fprintf( option_usage_fp, zDis, pOD->pz_DisableName );
/*
- * IF the numeric option has a special callback,
- * THEN call it, requesting the range or other special info
+ * Check for argument types that have callbacks with magical properties
*/
- if ( (OPTST_GET_ARGTYPE(pOD->fOptState) == OPARG_TYPE_NUMERIC)
- && (pOD->pOptProc != NULL)
- && (pOD->pOptProc != optionNumericVal) ) {
- (*(pOD->pOptProc))( pOptions, NULL );
+ switch (OPTST_GET_ARGTYPE(pOD->fOptState)) {
+ case OPARG_TYPE_NUMERIC:
+ /*
+ * IF the numeric option has a special callback,
+ * THEN call it, requesting the range or other special info
+ */
+ if ( (pOD->pOptProc != NULL)
+ && (pOD->pOptProc != optionNumericVal) ) {
+ (*(pOD->pOptProc))(OPTPROC_EMIT_USAGE, pOD);
+ }
+ break;
+
+ case OPARG_TYPE_FILE:
+ (*(pOD->pOptProc))(OPTPROC_EMIT_USAGE, pOD);
+ break;
}
/*
*/
if ((pOptions->fOptSet & OPTPROC_SHORTOPT) == 0)
fputs( pAT->pzSpc, option_usage_fp );
- else if (! isgraph( pOD->optValue)) {
+ else if (! IS_GRAPHIC_CHAR(pOD->optValue)) {
if ( (pOptions->fOptSet & (OPTPROC_GNUUSAGE|OPTPROC_LONGOPT))
== (OPTPROC_GNUUSAGE|OPTPROC_LONGOPT))
fputc( ' ', option_usage_fp );
* when the option argument is required, base the type string on the
* argument type.
*/
- if (OPTST_GET_ARGTYPE(pOD->fOptState) == OPARG_TYPE_NONE) {
- pzArgType = pAT->pzNo;
-
- } else if (pOD->fOptState & OPTST_ARG_OPTIONAL) {
+ if (pOD->fOptState & OPTST_ARG_OPTIONAL) {
pzArgType = pAT->pzOpt;
} else switch (OPTST_GET_ARGTYPE(pOD->fOptState)) {
+ case OPARG_TYPE_NONE: pzArgType = pAT->pzNo; break;
case OPARG_TYPE_ENUMERATION: pzArgType = pAT->pzKey; break;
+ case OPARG_TYPE_FILE : pzArgType = pAT->pzFile; break;
case OPARG_TYPE_MEMBERSHIP: pzArgType = pAT->pzKeyL; break;
case OPARG_TYPE_BOOLEAN: pzArgType = pAT->pzBool; break;
case OPARG_TYPE_NUMERIC: pzArgType = pAT->pzNum; break;
case OPARG_TYPE_HIERARCHY: pzArgType = pAT->pzNest; break;
case OPARG_TYPE_STRING: pzArgType = pAT->pzStr; break;
- default: goto bogus_desc; break;
+ case OPARG_TYPE_TIME: pzArgType = pAT->pzTime; break;
+ default: goto bogus_desc;
}
snprintf( z, sizeof(z), pAT->pzOptFmt, pzArgType, pOD->pz_Name,
int docCt = 0;
do {
- if ((pOD->fOptState & OPTST_OMITTED) != 0)
+ if ((pOD->fOptState & OPTST_NO_USAGE_MASK) != 0)
continue;
if ((pOD->fOptState & OPTST_DOCUMENT) != 0) {
* THEN document that the remaining options are not user opts
*/
if ( (pOpts->presetOptCt == optNo)
- && (ex_code == EXIT_SUCCESS)
- && (docCt > 0)
- && ((pOD[-1].fOptState & OPTST_DOCUMENT) == 0) )
+ && (ex_code == EXIT_SUCCESS)
+ && (docCt > 0)
+ && ((pOD[-1].fOptState & OPTST_DOCUMENT) == 0) )
fprintf( option_usage_fp, argTypes.pzBrk, zAuto, pOptTitle );
printOneUsage( pOpts, pOD, &argTypes );
switch (OPTST_GET_ARGTYPE(pOD->fOptState)) {
case OPARG_TYPE_ENUMERATION:
case OPARG_TYPE_MEMBERSHIP:
- (*(pOD->pOptProc))( NULL, pOD );
+ (*(pOD->pOptProc))(OPTPROC_EMIT_USAGE, pOD);
}
} while (pOD++, optNo++, (--ct > 0));
}
argTypes.pzNum = zGnuNumArg;
argTypes.pzKey = zGnuKeyArg;
argTypes.pzKeyL = zGnuKeyLArg;
+ argTypes.pzTime = zGnuTimeArg;
+ argTypes.pzFile = zGnuFileArg;
argTypes.pzBool = zGnuBoolArg;
argTypes.pzNest = zGnuNestArg;
argTypes.pzOpt = zGnuOptArg;
argTypes.pzNum = zStdNumArg;
argTypes.pzKey = zStdKeyArg;
argTypes.pzKeyL = zStdKeyLArg;
+ argTypes.pzTime = zStdTimeArg;
+ argTypes.pzFile = zStdFileArg;
argTypes.pzBool = zStdBoolArg;
argTypes.pzNest = zStdNestArg;
argTypes.pzOpt = zStdOptArg;
--- /dev/null
+/* ANSI-C code produced by gperf version 3.0.3 */
+
+
+#if 0 /* gperf build options: */
+// %struct-type
+// %language=ANSI-C
+// %includes
+// %global-table
+// %omit-struct-type
+// %readonly-tables
+// %compare-strncmp
+//
+// %define slot-name vtp_name
+// %define hash-function-name value_type_hash
+// %define lookup-function-name find_value_type_name
+// %define word-array-name value_type_table
+// %define initializer-suffix ,VTP_COUNT_KWD
+#endif /* gperf build options: */
+
+#include "value-type.h"
+
+typedef struct {
+ char const * vtp_name;
+ value_type_enum_t vtp_id;
+} value_type_map_t;
+#include <string.h>
+
+/* maximum key range = 20, duplicates = 0 */
+
+#ifdef __GNUC__
+#else
+#ifdef __cplusplus
+#endif
+#endif
+inline static unsigned int
+value_type_hash (register const char *str, register unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 10, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 5, 23, 23, 5, 0, 0, 23, 15, 23,
+ 23, 10, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23
+ };
+ return len + asso_values[(unsigned char)str[2]];
+}
+
+static const value_type_map_t value_type_table[] =
+ {
+ {"",VTP_COUNT_KWD}, {"",VTP_COUNT_KWD},
+ {"",VTP_COUNT_KWD},
+ {"set", VTP_KWD_SET},
+ {"",VTP_COUNT_KWD}, {"",VTP_COUNT_KWD},
+ {"nested", VTP_KWD_NESTED},
+ {"integer", VTP_KWD_INTEGER},
+ {"",VTP_COUNT_KWD},
+ {"bool", VTP_KWD_BOOL},
+ {"",VTP_COUNT_KWD},
+ {"string", VTP_KWD_STRING},
+ {"boolean", VTP_KWD_BOOLEAN},
+ {"",VTP_COUNT_KWD},
+ {"set-membership", VTP_KWD_SET_MEMBERSHIP},
+ {"",VTP_COUNT_KWD}, {"",VTP_COUNT_KWD},
+ {"keyword", VTP_KWD_KEYWORD},
+ {"",VTP_COUNT_KWD},
+ {"hierarchy", VTP_KWD_HIERARCHY},
+ {"",VTP_COUNT_KWD}, {"",VTP_COUNT_KWD},
+ {"invalid", VTP_KWD_INVALID}
+ };
+
+#ifdef __GNUC__
+#ifdef __GNUC_STDC_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+static inline const value_type_map_t *
+find_value_type_name (register const char *str, register unsigned int len)
+{
+ if (len <= 14 && len >= 3)
+ {
+ register int key = value_type_hash (str, len);
+
+ if (key <= 22 && key >= 0)
+ {
+ register const char *s = value_type_table[key].vtp_name;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0')
+ return &value_type_table[key];
+ }
+ }
+ return 0;
+}
+
+
+value_type_enum_t
+find_value_type_id(char const * str, unsigned int len)
+{
+ const value_type_map_t * p =
+ find_value_type_name(str, len);
+ return (p == 0) ? VTP_KWD_INVALID : p->vtp_id;
+}
--- /dev/null
+/*
+ * Generated header for gperf generated source Sat May 16 08:16:06 PDT 2009
+ * This file enumerates the list of names and declares the
+ * procedure for mapping string names to the enum value.
+ */
+#ifndef AUTOOPTS_VALUE_TYPE_H_GUARD
+#define AUTOOPTS_VALUE_TYPE_H_GUARD 1
+
+typedef enum {
+ VTP_KWD_INVALID,
+ VTP_KWD_STRING,
+ VTP_KWD_INTEGER,
+ VTP_KWD_BOOLEAN,
+ VTP_KWD_BOOL,
+ VTP_KWD_KEYWORD,
+ VTP_KWD_SET,
+ VTP_KWD_SET_MEMBERSHIP,
+ VTP_KWD_NESTED,
+ VTP_KWD_HIERARCHY,
+ VTP_COUNT_KWD
+} value_type_enum_t;
+
+extern value_type_enum_t
+find_value_type_id(char const * str, unsigned int len);
+#endif /* AUTOOPTS_VALUE_TYPE_H_GUARD */
-/* $Id: version.c,v 4.10 2007/04/28 22:19:23 bkorb Exp $
- * Time-stamp: "2007-04-28 10:08:34 bkorb"
+/* $Id: version.c,v 4.16 2009/01/01 16:51:50 bkorb Exp $
+ * Time-stamp: "2008-07-27 10:11:30 bkorb"
*
* This module implements the default usage procedure for
* Automated Options. It may be overridden, of course.
*/
-static char const zAOV[] =
- "Automated Options version %s, copyright (c) 1999-2007 Bruce Korb\n";
-
-/* Automated Options is free software.
- * You may redistribute it and/or modify it under the terms of the
- * GNU General Public License, as published by the Free Software
- * Foundation; either version 2, or (at your option) any later version.
- *
- * Automated Options 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 Automated Options. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+/*
+ * This file is part of AutoOpts, a companion to AutoGen.
+ * AutoOpts is free software.
+ * AutoOpts is copyright (c) 1992-2009 by Bruce Korb - all rights reserved
*
- * As a special exception, Bruce Korb gives permission for additional
- * uses of the text contained in his release of AutoOpts.
+ * AutoOpts is available under any one of two licenses. The license
+ * in use must be one of these two and the choice is under the control
+ * of the user of the license.
*
- * The exception is that, if you link the AutoOpts library with other
- * files to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the AutoOpts library code into it.
+ * The GNU Lesser General Public License, version 3 or later
+ * See the files "COPYING.lgplv3" and "COPYING.gplv3"
*
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * The Modified Berkeley Software Distribution License
+ * See the file "COPYING.mbsd"
*
- * This exception applies only to the code released by Bruce Korb under
- * the name AutoOpts. If you copy code from other sources under the
- * General Public License into a copy of AutoOpts, as the General Public
- * License permits, the exception does not apply to the code that you add
- * in this way. To avoid misleading anyone as to the status of such
- * modified files, you must delete this exception notice from them.
+ * These files have the following md5sums:
*
- * If you write modifications of your own for AutoOpts, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
+ * 239588c55c22c60ffe159946a760a33e pkg/libopts/COPYING.gplv3
+ * fa82ca978890795162346e661b47161a pkg/libopts/COPYING.lgplv3
+ * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
*/
/* = = = START-STATIC-FORWARD = = = */
-/* static forward declarations maintained by :mkfwd */
+/* static forward declarations maintained by mk-fwd */
static void
printVersion( tOptions* pOpts, tOptDesc* pOD, FILE* fp );
/* = = = END-STATIC-FORWARD = = = */
fputs( pOpts->pzCopyright, fp );
fputc( '\n', fp );
}
- fprintf( fp, zAOV, optionVersion() );
+ fprintf( fp, zAO_Ver, optionVersion() );
if (pOpts->pzBugAddr != NULL)
fprintf( fp, zPlsSendBugs, pOpts->pzBugAddr );
break;
fputc( '\n', fp );
}
- fprintf( fp, zAOV, optionVersion() );
+ fprintf( fp, zAO_Ver, optionVersion() );
if (pOpts->pzBugAddr != NULL)
fprintf( fp, zPlsSendBugs, pOpts->pzBugAddr );
break;
--- /dev/null
+/* ANSI-C code produced by gperf version 3.0.3 */
+
+
+#if 0 /* gperf build options: */
+// %struct-type
+// %language=ANSI-C
+// %includes
+// %global-table
+// %omit-struct-type
+// %readonly-tables
+// %compare-strncmp
+//
+// %define slot-name xat_name
+// %define hash-function-name xat_attribute_hash
+// %define lookup-function-name find_xat_attribute_name
+// %define word-array-name xat_attribute_table
+// %define initializer-suffix ,XAT_COUNT_KWD
+#endif /* gperf build options: */
+
+#include "xat-attribute.h"
+
+typedef struct {
+ char const * xat_name;
+ xat_attribute_enum_t xat_id;
+} xat_attribute_map_t;
+#include <string.h>
+
+/* maximum key range = 9, duplicates = 0 */
+
+#ifdef __GNUC__
+#else
+#ifdef __cplusplus
+#endif
+#endif
+inline static unsigned int
+xat_attribute_hash (register const char *str, register unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 0,
+ 13, 13, 13, 13, 13, 5, 13, 5, 13, 0,
+ 13, 13, 13, 13, 13, 13, 0, 0, 13, 0,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13
+ };
+ return len + asso_values[(unsigned char)str[0]];
+}
+
+static const xat_attribute_map_t xat_attribute_table[] =
+ {
+ {"",XAT_COUNT_KWD}, {"",XAT_COUNT_KWD},
+ {"",XAT_COUNT_KWD}, {"",XAT_COUNT_KWD},
+ {"type", XAT_KWD_TYPE},
+ {"words", XAT_KWD_WORDS},
+ {"cooked", XAT_KWD_COOKED},
+ {"members", XAT_KWD_MEMBERS},
+ {"uncooked", XAT_KWD_UNCOOKED},
+ {"keep", XAT_KWD_KEEP},
+ {"",XAT_COUNT_KWD}, {"",XAT_COUNT_KWD},
+ {"invalid", XAT_KWD_INVALID}
+ };
+
+#ifdef __GNUC__
+#ifdef __GNUC_STDC_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+static inline const xat_attribute_map_t *
+find_xat_attribute_name (register const char *str, register unsigned int len)
+{
+ if (len <= 8 && len >= 4)
+ {
+ register int key = xat_attribute_hash (str, len);
+
+ if (key <= 12 && key >= 0)
+ {
+ register const char *s = xat_attribute_table[key].xat_name;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0')
+ return &xat_attribute_table[key];
+ }
+ }
+ return 0;
+}
+
+
+xat_attribute_enum_t
+find_xat_attribute_id(char const * str, unsigned int len)
+{
+ const xat_attribute_map_t * p =
+ find_xat_attribute_name(str, len);
+ return (p == 0) ? XAT_KWD_INVALID : p->xat_id;
+}
--- /dev/null
+/*
+ * Generated header for gperf generated source Sat May 16 08:16:06 PDT 2009
+ * This file enumerates the list of names and declares the
+ * procedure for mapping string names to the enum value.
+ */
+#ifndef AUTOOPTS_XAT_ATTRIBUTE_H_GUARD
+#define AUTOOPTS_XAT_ATTRIBUTE_H_GUARD 1
+
+typedef enum {
+ XAT_KWD_INVALID,
+ XAT_KWD_TYPE,
+ XAT_KWD_WORDS,
+ XAT_KWD_MEMBERS,
+ XAT_KWD_COOKED,
+ XAT_KWD_UNCOOKED,
+ XAT_KWD_KEEP,
+ XAT_COUNT_KWD
+} xat_attribute_enum_t;
+
+extern xat_attribute_enum_t
+find_xat_attribute_id(char const * str, unsigned int len);
+#endif /* AUTOOPTS_XAT_ATTRIBUTE_H_GUARD */