From ee4cfcdd2fb55d3e270c8ff4b7d7f89861254f81 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Sun, 25 Mar 2018 21:06:56 -0400 Subject: [PATCH] Added shell and licensing --- LICENSE | 675 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Makefile | 20 ++ builtins.c | 21 ++ builtins.h | 30 +++ old.tar.gz | Bin 46683 -> 0 bytes ops.c | 20 ++ ops.h | 31 +++ parser.c | 20 ++ parser.h | 129 ++++++++-- shell.c.bak | 72 ++++++ variable.h | 44 +++- 11 files changed, 1039 insertions(+), 23 deletions(-) create mode 100644 LICENSE delete mode 100644 old.tar.gz create mode 100644 shell.c.bak diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..53d1f3d --- /dev/null +++ b/LICENSE @@ -0,0 +1,675 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + diff --git a/Makefile b/Makefile index 7723c00..281e8aa 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,23 @@ +## +# @file Makefile +# Script for compiling the interpreter library/shell +# +# Copyright (C) 2018 Clyne Sullivan +# +# 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 . +# + CFLAGS = -ggdb -fsigned-char -fno-builtin -Wall -Wextra -Werror -pedantic CFILES = $(wildcard *.c) diff --git a/builtins.c b/builtins.c index 1c40be1..c68b3d9 100644 --- a/builtins.c +++ b/builtins.c @@ -1,3 +1,24 @@ +/** + * @file builtins.c + * Provides built-in functions for the interpreter + * These must be loaded for an instance to do anything meaningful. + * + * Copyright (C) 2018 Clyne Sullivan + * + * 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 . + */ + #include "builtins.h" #include diff --git a/builtins.h b/builtins.h index 7570eab..6a9b012 100644 --- a/builtins.h +++ b/builtins.h @@ -1,3 +1,24 @@ +/** + * @file builtins.h + * Provides built-in functions for the interpreter + * These must be loaded for an instance to do anything meaningful. + * + * Copyright (C) 2018 Clyne Sullivan + * + * 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 . + */ + #ifndef BUILTINS_H_ #define BUILTINS_H_ @@ -6,8 +27,17 @@ #define SKIP_SIG (uint32_t)-5 #define CALL_SIG (uint32_t)-6 +/** + * Loads the built-in functions into the given instance. + * @param it the instance to use + */ void iload_builtins(instance *it); +/** + * The built-in 'end' function, called at closed scopes (i.e. '}'). + * Exposed for the parser so that closing brackets can be tied to this call. + * @param it the current instance + */ int bn_end(instance *it); #endif // BUILTINS_H_ diff --git a/old.tar.gz b/old.tar.gz deleted file mode 100644 index 0a2e13f46fb45bbc7d99b6cde2ac47320668fe97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46683 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 DL`mvE diff --git a/ops.c b/ops.c index 0d6b292..1fb878d 100644 --- a/ops.c +++ b/ops.c @@ -1,3 +1,23 @@ +/** + * @file ops.c + * Provides arithematic operators to the parser + * + * Copyright (C) 2018 Clyne Sullivan + * + * 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 . + */ + #include "ops.h" #include diff --git a/ops.h b/ops.h index 8296cbe..5941d02 100644 --- a/ops.h +++ b/ops.h @@ -1,14 +1,45 @@ +/** + * @file ops.h + * Provides arithematic operators to the parser + * + * Copyright (C) 2018 Clyne Sullivan + * + * 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 . + */ + #ifndef OPS_H_ #define OPS_H_ #include "variable.h" +/** + * Defines the number of available operators. + */ #define OPS_COUNT 18 + #define OP_MAGIC 0xCAFE3900 typedef int (*opfunc_t)(variable *, variable *, variable *); +/** + * An array of variable objects for each operator, exposed for the parser. + */ extern variable opvars[]; + +/** + * An array of operator names, exposed for the parser. + */ extern const char *opnames[]; #endif // OPS_H_ diff --git a/parser.c b/parser.c index 1168b3b..ecf3a50 100644 --- a/parser.c +++ b/parser.c @@ -1,3 +1,23 @@ +/** + * @file parser.c + * Main library component; parses, manages and runs script + * + * Copyright (C) 2018 Clyne Sullivan + * + * 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 . + */ + #include "parser.h" #include "builtins.h" diff --git a/parser.h b/parser.h index f1d6366..0002d06 100644 --- a/parser.h +++ b/parser.h @@ -1,3 +1,23 @@ +/** + * @file parser.h + * Main library component; parses, manages and runs script + * + * Copyright (C) 2018 Clyne Sullivan + * + * 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 . + */ + #ifndef PARSER_H_ #define PARSER_H_ @@ -5,36 +25,117 @@ #include +/** + * Contains data for an 'instance' of script. + * Multiple instances can be created to run different scripts at once. + */ typedef struct { - variable *vars; - char **names; - uint32_t *stack; - uint32_t stidx; - variable ***lines; - uint32_t lnidx; - variable *ret; - uint8_t indent; - uint8_t sindent; + variable *vars; /**< An array of defined variables */ + char **names; /**< An array of names for the variables */ + uint32_t *stack; /**< The instance's stack */ + uint32_t stidx; /**< The instance's position in the stack */ + variable ***lines; /**< Compiled data for each line of script */ + uint32_t lnidx; /**< Position in script/line being run */ + variable *ret; /**< Pointer to the last returned variable */ + uint8_t indent; /**< Current indent/scope of the instance */ + uint8_t sindent; /**< Indent of scope to skip, for false conditionals */ } instance; +/** + * A flag to set in instance.sindent to determine if code should be skipped + * over. + */ #define SKIP (1 << 7) typedef int (*func_t)(instance *); +/** + * Creates a new parser instance, loading the built-in library into it. + * @return a new, malloc'd instance + */ instance *inewinstance(void); + +/** + * Destroys an instance, freeing all used memory including for the instance + * itself. + * @param it the instance to destroy + */ void idelinstance(instance *it); +/** + * Adds and runs the line through the parser instance. + * This parses and runs the line, while storing it at the current line index. + * @param it the current instance + * @param s the line to parse/run + */ int idoline(instance *it, const char *s); -variable **iparse(instance *it, const char *s); -variable *isolve(instance *it, variable **ops, uint32_t count); +/** + * Makes a C function visible to the script. + * @param it the current instance + * @param name the name of the function when called from the script + * @param func the C function + */ void inew_cfunc(instance *it, const char *name, func_t func); -variable *make_varf(variable *v, float f); -variable *make_vars(variable *v, const char *s); - +/** + * Pops a word from the instance's stack. + * @param it the current instance + * @return the popped value + */ uint32_t ipop(instance *it); + +/** + * Pushes a word to the instance's stack. + * @param it the current instance + * @param v the word to push + */ void ipush(instance *it, uint32_t v); + +/** + * Gets the nth argument passed to the current C function. + * This call has no protections. + * @param it the current instance + * @param n the index of the argument, zero-based + * @return the argument's variable + */ variable *igetarg(instance *it, uint32_t n); + + +/** + * Parses the given line, returning compiled data to run. + * For internal use only. + * @param it the current instance + * @param s the string to parse + * @return the 'compiled code' + */ +variable **iparse(instance *it, const char *s); + +/** + * 'Solves' (runs) the given compiled data, returning what the line returns. + * For internal use only. + * @param it the current instance + * @param ops the compiled data to run + * @param count the size of the ops array, zero if unknown + * @return the variable returned by the line, null if none + */ +variable *isolve(instance *it, variable **ops, uint32_t count); + +/** + * Makes a number out of the given variable. + * @param v the variable to use, if zero one is malloc'd + * @param f the number to assign the variable + * @return the new float variable + */ +variable *make_varf(variable *v, float f); + +/** + * Makes a string out of the given variable. + * @param v the variable to use, if zero one is malloc'd + * @param f the string to assign the variable + * @return the new string variable + */ +variable *make_vars(variable *v, const char *s); + #endif // PARSER_H_ diff --git a/shell.c.bak b/shell.c.bak new file mode 100644 index 0000000..a2a2100 --- /dev/null +++ b/shell.c.bak @@ -0,0 +1,72 @@ +/** + * @file shell.c + * File loader to test scripts in host environment + * + * Copyright (C) 2018 Clyne Sullivan + * + * 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 . + */ + +#include +#include + +#include "parser.h" + +int print(instance *it) +{ + variable *s = igetarg(it, 0); + if (s->type == NUMBER) { + if (s->value.f == (int)s->value.f) + printf("%d\n", (int)s->value.f); + else + printf("%.3f\n", s->value.f); + } else if (s->value.p != 0) { + printf("%s\n", (char *)s->value.p); + } + return 0; +} + +int main(int argc, char **argv) +{ + if (argc != 2) { + printf("Usage: %s file\n", argv[0]); + return -1; + } + + FILE *fp = fopen(argv[1], "r"); + if (fp == 0) { + printf("Could not open file: %s\n", argv[1]); + return -1; + } + + instance *it = inewinstance(); + inew_cfunc(it, "print", print); + + char *line = 0; + size_t size; + int result; + while (getline(&line, &size, fp) != -1) { + *strchr(line, '\n') = '\0'; + result = idoline(it, line); + if (result != 0) + printf("Error: %d\n", result); + //if (it->ret != 0) + // printf("%s = %f\n", line, it->ret->value.f); + } + + fclose(fp); + idelinstance(it); + return 0; +} + diff --git a/variable.h b/variable.h index 4c7b987..40b86bd 100644 --- a/variable.h +++ b/variable.h @@ -1,24 +1,50 @@ +/** + * @file variable.h + * Defines variable data structure + * + * Copyright (C) 2018 Clyne Sullivan + * + * 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 . + */ + #ifndef VARIABLE_H_ #define VARIABLE_H_ #include +/** + * Data for a script variable. + */ typedef struct { - uint8_t tmp :1; - uint8_t type :3; - uint8_t unused :4; + uint8_t tmp :1; /**< If zero, variable cannot be free'd */ + uint8_t type :3; /**< The variable's type */ + uint8_t unused :4; /**< Unused... */ union { float f; uint32_t p; - } value; + } value; /**< The variable's value, either float or a pointer */ } variable; +/** + * Defines possible variable types. + */ enum VARTYPE { - NUMBER = 0, - STRING, - OPERATOR, - FUNC, - CFUNC, + NUMBER = 0, /**< Number/float */ + STRING, /**< String of text */ + OPERATOR, /**< Arithmetical operation */ + FUNC, /**< In-script function */ + CFUNC, /**< C function */ }; #endif // VARIABLE_H_