Initial commit
This commit is contained in:
		
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					/build/
 | 
				
			||||||
 | 
					a.out
 | 
				
			||||||
							
								
								
									
										373
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										373
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,373 @@
 | 
				
			|||||||
 | 
					Mozilla Public License Version 2.0
 | 
				
			||||||
 | 
					==================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. Definitions
 | 
				
			||||||
 | 
					--------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1.1. "Contributor"
 | 
				
			||||||
 | 
					    means each individual or legal entity that creates, contributes to
 | 
				
			||||||
 | 
					    the creation of, or owns Covered Software.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1.2. "Contributor Version"
 | 
				
			||||||
 | 
					    means the combination of the Contributions of others (if any) used
 | 
				
			||||||
 | 
					    by a Contributor and that particular Contributor's Contribution.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1.3. "Contribution"
 | 
				
			||||||
 | 
					    means Covered Software of a particular Contributor.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1.4. "Covered Software"
 | 
				
			||||||
 | 
					    means Source Code Form to which the initial Contributor has attached
 | 
				
			||||||
 | 
					    the notice in Exhibit A, the Executable Form of such Source Code
 | 
				
			||||||
 | 
					    Form, and Modifications of such Source Code Form, in each case
 | 
				
			||||||
 | 
					    including portions thereof.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1.5. "Incompatible With Secondary Licenses"
 | 
				
			||||||
 | 
					    means
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    (a) that the initial Contributor has attached the notice described
 | 
				
			||||||
 | 
					        in Exhibit B to the Covered Software; or
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    (b) that the Covered Software was made available under the terms of
 | 
				
			||||||
 | 
					        version 1.1 or earlier of the License, but not also under the
 | 
				
			||||||
 | 
					        terms of a Secondary License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1.6. "Executable Form"
 | 
				
			||||||
 | 
					    means any form of the work other than Source Code Form.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1.7. "Larger Work"
 | 
				
			||||||
 | 
					    means a work that combines Covered Software with other material, in
 | 
				
			||||||
 | 
					    a separate file or files, that is not Covered Software.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1.8. "License"
 | 
				
			||||||
 | 
					    means this document.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1.9. "Licensable"
 | 
				
			||||||
 | 
					    means having the right to grant, to the maximum extent possible,
 | 
				
			||||||
 | 
					    whether at the time of the initial grant or subsequently, any and
 | 
				
			||||||
 | 
					    all of the rights conveyed by this License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1.10. "Modifications"
 | 
				
			||||||
 | 
					    means any of the following:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    (a) any file in Source Code Form that results from an addition to,
 | 
				
			||||||
 | 
					        deletion from, or modification of the contents of Covered
 | 
				
			||||||
 | 
					        Software; or
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    (b) any new file in Source Code Form that contains any Covered
 | 
				
			||||||
 | 
					        Software.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1.11. "Patent Claims" of a Contributor
 | 
				
			||||||
 | 
					    means any patent claim(s), including without limitation, method,
 | 
				
			||||||
 | 
					    process, and apparatus claims, in any patent Licensable by such
 | 
				
			||||||
 | 
					    Contributor that would be infringed, but for the grant of the
 | 
				
			||||||
 | 
					    License, by the making, using, selling, offering for sale, having
 | 
				
			||||||
 | 
					    made, import, or transfer of either its Contributions or its
 | 
				
			||||||
 | 
					    Contributor Version.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1.12. "Secondary License"
 | 
				
			||||||
 | 
					    means either the GNU General Public License, Version 2.0, the GNU
 | 
				
			||||||
 | 
					    Lesser General Public License, Version 2.1, the GNU Affero General
 | 
				
			||||||
 | 
					    Public License, Version 3.0, or any later versions of those
 | 
				
			||||||
 | 
					    licenses.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1.13. "Source Code Form"
 | 
				
			||||||
 | 
					    means the form of the work preferred for making modifications.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1.14. "You" (or "Your")
 | 
				
			||||||
 | 
					    means an individual or a legal entity exercising rights under this
 | 
				
			||||||
 | 
					    License. For legal entities, "You" includes any entity that
 | 
				
			||||||
 | 
					    controls, is controlled by, or is under common control with You. For
 | 
				
			||||||
 | 
					    purposes of this definition, "control" means (a) the power, direct
 | 
				
			||||||
 | 
					    or indirect, to cause the direction or management of such entity,
 | 
				
			||||||
 | 
					    whether by contract or otherwise, or (b) ownership of more than
 | 
				
			||||||
 | 
					    fifty percent (50%) of the outstanding shares or beneficial
 | 
				
			||||||
 | 
					    ownership of such entity.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					2. License Grants and Conditions
 | 
				
			||||||
 | 
					--------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					2.1. Grants
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Each Contributor hereby grants You a world-wide, royalty-free,
 | 
				
			||||||
 | 
					non-exclusive license:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(a) under intellectual property rights (other than patent or trademark)
 | 
				
			||||||
 | 
					    Licensable by such Contributor to use, reproduce, make available,
 | 
				
			||||||
 | 
					    modify, display, perform, distribute, and otherwise exploit its
 | 
				
			||||||
 | 
					    Contributions, either on an unmodified basis, with Modifications, or
 | 
				
			||||||
 | 
					    as part of a Larger Work; and
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(b) under Patent Claims of such Contributor to make, use, sell, offer
 | 
				
			||||||
 | 
					    for sale, have made, import, and otherwise transfer either its
 | 
				
			||||||
 | 
					    Contributions or its Contributor Version.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					2.2. Effective Date
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The licenses granted in Section 2.1 with respect to any Contribution
 | 
				
			||||||
 | 
					become effective for each Contribution on the date the Contributor first
 | 
				
			||||||
 | 
					distributes such Contribution.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					2.3. Limitations on Grant Scope
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The licenses granted in this Section 2 are the only rights granted under
 | 
				
			||||||
 | 
					this License. No additional rights or licenses will be implied from the
 | 
				
			||||||
 | 
					distribution or licensing of Covered Software under this License.
 | 
				
			||||||
 | 
					Notwithstanding Section 2.1(b) above, no patent license is granted by a
 | 
				
			||||||
 | 
					Contributor:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(a) for any code that a Contributor has removed from Covered Software;
 | 
				
			||||||
 | 
					    or
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(b) for infringements caused by: (i) Your and any other third party's
 | 
				
			||||||
 | 
					    modifications of Covered Software, or (ii) the combination of its
 | 
				
			||||||
 | 
					    Contributions with other software (except as part of its Contributor
 | 
				
			||||||
 | 
					    Version); or
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(c) under Patent Claims infringed by Covered Software in the absence of
 | 
				
			||||||
 | 
					    its Contributions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This License does not grant any rights in the trademarks, service marks,
 | 
				
			||||||
 | 
					or logos of any Contributor (except as may be necessary to comply with
 | 
				
			||||||
 | 
					the notice requirements in Section 3.4).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					2.4. Subsequent Licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					No Contributor makes additional grants as a result of Your choice to
 | 
				
			||||||
 | 
					distribute the Covered Software under a subsequent version of this
 | 
				
			||||||
 | 
					License (see Section 10.2) or under the terms of a Secondary License (if
 | 
				
			||||||
 | 
					permitted under the terms of Section 3.3).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					2.5. Representation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Each Contributor represents that the Contributor believes its
 | 
				
			||||||
 | 
					Contributions are its original creation(s) or it has sufficient rights
 | 
				
			||||||
 | 
					to grant the rights to its Contributions conveyed by this License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					2.6. Fair Use
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This License is not intended to limit any rights You have under
 | 
				
			||||||
 | 
					applicable copyright doctrines of fair use, fair dealing, or other
 | 
				
			||||||
 | 
					equivalents.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					2.7. Conditions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
 | 
				
			||||||
 | 
					in Section 2.1.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					3. Responsibilities
 | 
				
			||||||
 | 
					-------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					3.1. Distribution of Source Form
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					All distribution of Covered Software in Source Code Form, including any
 | 
				
			||||||
 | 
					Modifications that You create or to which You contribute, must be under
 | 
				
			||||||
 | 
					the terms of this License. You must inform recipients that the Source
 | 
				
			||||||
 | 
					Code Form of the Covered Software is governed by the terms of this
 | 
				
			||||||
 | 
					License, and how they can obtain a copy of this License. You may not
 | 
				
			||||||
 | 
					attempt to alter or restrict the recipients' rights in the Source Code
 | 
				
			||||||
 | 
					Form.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					3.2. Distribution of Executable Form
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If You distribute Covered Software in Executable Form then:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(a) such Covered Software must also be made available in Source Code
 | 
				
			||||||
 | 
					    Form, as described in Section 3.1, and You must inform recipients of
 | 
				
			||||||
 | 
					    the Executable Form how they can obtain a copy of such Source Code
 | 
				
			||||||
 | 
					    Form by reasonable means in a timely manner, at a charge no more
 | 
				
			||||||
 | 
					    than the cost of distribution to the recipient; and
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(b) You may distribute such Executable Form under the terms of this
 | 
				
			||||||
 | 
					    License, or sublicense it under different terms, provided that the
 | 
				
			||||||
 | 
					    license for the Executable Form does not attempt to limit or alter
 | 
				
			||||||
 | 
					    the recipients' rights in the Source Code Form under this License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					3.3. Distribution of a Larger Work
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You may create and distribute a Larger Work under terms of Your choice,
 | 
				
			||||||
 | 
					provided that You also comply with the requirements of this License for
 | 
				
			||||||
 | 
					the Covered Software. If the Larger Work is a combination of Covered
 | 
				
			||||||
 | 
					Software with a work governed by one or more Secondary Licenses, and the
 | 
				
			||||||
 | 
					Covered Software is not Incompatible With Secondary Licenses, this
 | 
				
			||||||
 | 
					License permits You to additionally distribute such Covered Software
 | 
				
			||||||
 | 
					under the terms of such Secondary License(s), so that the recipient of
 | 
				
			||||||
 | 
					the Larger Work may, at their option, further distribute the Covered
 | 
				
			||||||
 | 
					Software under the terms of either this License or such Secondary
 | 
				
			||||||
 | 
					License(s).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					3.4. Notices
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You may not remove or alter the substance of any license notices
 | 
				
			||||||
 | 
					(including copyright notices, patent notices, disclaimers of warranty,
 | 
				
			||||||
 | 
					or limitations of liability) contained within the Source Code Form of
 | 
				
			||||||
 | 
					the Covered Software, except that You may alter any license notices to
 | 
				
			||||||
 | 
					the extent required to remedy known factual inaccuracies.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					3.5. Application of Additional Terms
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You may choose to offer, and to charge a fee for, warranty, support,
 | 
				
			||||||
 | 
					indemnity or liability obligations to one or more recipients of Covered
 | 
				
			||||||
 | 
					Software. However, You may do so only on Your own behalf, and not on
 | 
				
			||||||
 | 
					behalf of any Contributor. You must make it absolutely clear that any
 | 
				
			||||||
 | 
					such warranty, support, indemnity, or liability obligation is offered by
 | 
				
			||||||
 | 
					You alone, and You hereby agree to indemnify every Contributor for any
 | 
				
			||||||
 | 
					liability incurred by such Contributor as a result of warranty, support,
 | 
				
			||||||
 | 
					indemnity or liability terms You offer. You may include additional
 | 
				
			||||||
 | 
					disclaimers of warranty and limitations of liability specific to any
 | 
				
			||||||
 | 
					jurisdiction.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					4. Inability to Comply Due to Statute or Regulation
 | 
				
			||||||
 | 
					---------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If it is impossible for You to comply with any of the terms of this
 | 
				
			||||||
 | 
					License with respect to some or all of the Covered Software due to
 | 
				
			||||||
 | 
					statute, judicial order, or regulation then You must: (a) comply with
 | 
				
			||||||
 | 
					the terms of this License to the maximum extent possible; and (b)
 | 
				
			||||||
 | 
					describe the limitations and the code they affect. Such description must
 | 
				
			||||||
 | 
					be placed in a text file included with all distributions of the Covered
 | 
				
			||||||
 | 
					Software under this License. Except to the extent prohibited by statute
 | 
				
			||||||
 | 
					or regulation, such description must be sufficiently detailed for a
 | 
				
			||||||
 | 
					recipient of ordinary skill to be able to understand it.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					5. Termination
 | 
				
			||||||
 | 
					--------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					5.1. The rights granted under this License will terminate automatically
 | 
				
			||||||
 | 
					if You fail to comply with any of its terms. However, if You become
 | 
				
			||||||
 | 
					compliant, then the rights granted under this License from a particular
 | 
				
			||||||
 | 
					Contributor are reinstated (a) provisionally, unless and until such
 | 
				
			||||||
 | 
					Contributor explicitly and finally terminates Your grants, and (b) on an
 | 
				
			||||||
 | 
					ongoing basis, if such Contributor fails to notify You of the
 | 
				
			||||||
 | 
					non-compliance by some reasonable means prior to 60 days after You have
 | 
				
			||||||
 | 
					come back into compliance. Moreover, Your grants from a particular
 | 
				
			||||||
 | 
					Contributor are reinstated on an ongoing basis if such Contributor
 | 
				
			||||||
 | 
					notifies You of the non-compliance by some reasonable means, this is the
 | 
				
			||||||
 | 
					first time You have received notice of non-compliance with this License
 | 
				
			||||||
 | 
					from such Contributor, and You become compliant prior to 30 days after
 | 
				
			||||||
 | 
					Your receipt of the notice.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					5.2. If You initiate litigation against any entity by asserting a patent
 | 
				
			||||||
 | 
					infringement claim (excluding declaratory judgment actions,
 | 
				
			||||||
 | 
					counter-claims, and cross-claims) alleging that a Contributor Version
 | 
				
			||||||
 | 
					directly or indirectly infringes any patent, then the rights granted to
 | 
				
			||||||
 | 
					You by any and all Contributors for the Covered Software under Section
 | 
				
			||||||
 | 
					2.1 of this License shall terminate.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					5.3. In the event of termination under Sections 5.1 or 5.2 above, all
 | 
				
			||||||
 | 
					end user license agreements (excluding distributors and resellers) which
 | 
				
			||||||
 | 
					have been validly granted by You or Your distributors under this License
 | 
				
			||||||
 | 
					prior to termination shall survive termination.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					************************************************************************
 | 
				
			||||||
 | 
					*                                                                      *
 | 
				
			||||||
 | 
					*  6. Disclaimer of Warranty                                           *
 | 
				
			||||||
 | 
					*  -------------------------                                           *
 | 
				
			||||||
 | 
					*                                                                      *
 | 
				
			||||||
 | 
					*  Covered Software is provided under this License on an "as is"       *
 | 
				
			||||||
 | 
					*  basis, without warranty of any kind, either expressed, implied, or  *
 | 
				
			||||||
 | 
					*  statutory, including, without limitation, warranties that the       *
 | 
				
			||||||
 | 
					*  Covered Software is free of defects, merchantable, fit for a        *
 | 
				
			||||||
 | 
					*  particular purpose or non-infringing. The entire risk as to the     *
 | 
				
			||||||
 | 
					*  quality and performance of the Covered Software is with You.        *
 | 
				
			||||||
 | 
					*  Should any Covered Software prove defective in any respect, You     *
 | 
				
			||||||
 | 
					*  (not any Contributor) assume the cost of any necessary servicing,   *
 | 
				
			||||||
 | 
					*  repair, or correction. This disclaimer of warranty constitutes an   *
 | 
				
			||||||
 | 
					*  essential part of this License. No use of any Covered Software is   *
 | 
				
			||||||
 | 
					*  authorized under this License except under this disclaimer.         *
 | 
				
			||||||
 | 
					*                                                                      *
 | 
				
			||||||
 | 
					************************************************************************
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					************************************************************************
 | 
				
			||||||
 | 
					*                                                                      *
 | 
				
			||||||
 | 
					*  7. Limitation of Liability                                          *
 | 
				
			||||||
 | 
					*  --------------------------                                          *
 | 
				
			||||||
 | 
					*                                                                      *
 | 
				
			||||||
 | 
					*  Under no circumstances and under no legal theory, whether tort      *
 | 
				
			||||||
 | 
					*  (including negligence), contract, or otherwise, shall any           *
 | 
				
			||||||
 | 
					*  Contributor, or anyone who distributes Covered Software as          *
 | 
				
			||||||
 | 
					*  permitted above, be liable to You for any direct, indirect,         *
 | 
				
			||||||
 | 
					*  special, incidental, or consequential damages of any character      *
 | 
				
			||||||
 | 
					*  including, without limitation, damages for lost profits, loss of    *
 | 
				
			||||||
 | 
					*  goodwill, work stoppage, computer failure or malfunction, or any    *
 | 
				
			||||||
 | 
					*  and all other commercial damages or losses, even if such party      *
 | 
				
			||||||
 | 
					*  shall have been informed of the possibility of such damages. This   *
 | 
				
			||||||
 | 
					*  limitation of liability shall not apply to liability for death or   *
 | 
				
			||||||
 | 
					*  personal injury resulting from such party's negligence to the       *
 | 
				
			||||||
 | 
					*  extent applicable law prohibits such limitation. Some               *
 | 
				
			||||||
 | 
					*  jurisdictions do not allow the exclusion or limitation of           *
 | 
				
			||||||
 | 
					*  incidental or consequential damages, so this exclusion and          *
 | 
				
			||||||
 | 
					*  limitation may not apply to You.                                    *
 | 
				
			||||||
 | 
					*                                                                      *
 | 
				
			||||||
 | 
					************************************************************************
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					8. Litigation
 | 
				
			||||||
 | 
					-------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Any litigation relating to this License may be brought only in the
 | 
				
			||||||
 | 
					courts of a jurisdiction where the defendant maintains its principal
 | 
				
			||||||
 | 
					place of business and such litigation shall be governed by laws of that
 | 
				
			||||||
 | 
					jurisdiction, without reference to its conflict-of-law provisions.
 | 
				
			||||||
 | 
					Nothing in this Section shall prevent a party's ability to bring
 | 
				
			||||||
 | 
					cross-claims or counter-claims.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					9. Miscellaneous
 | 
				
			||||||
 | 
					----------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This License represents the complete agreement concerning the subject
 | 
				
			||||||
 | 
					matter hereof. If any provision of this License is held to be
 | 
				
			||||||
 | 
					unenforceable, such provision shall be reformed only to the extent
 | 
				
			||||||
 | 
					necessary to make it enforceable. Any law or regulation which provides
 | 
				
			||||||
 | 
					that the language of a contract shall be construed against the drafter
 | 
				
			||||||
 | 
					shall not be used to construe this License against a Contributor.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					10. Versions of the License
 | 
				
			||||||
 | 
					---------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					10.1. New Versions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Mozilla Foundation is the license steward. Except as provided in Section
 | 
				
			||||||
 | 
					10.3, no one other than the license steward has the right to modify or
 | 
				
			||||||
 | 
					publish new versions of this License. Each version will be given a
 | 
				
			||||||
 | 
					distinguishing version number.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					10.2. Effect of New Versions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You may distribute the Covered Software under the terms of the version
 | 
				
			||||||
 | 
					of the License under which You originally received the Covered Software,
 | 
				
			||||||
 | 
					or under the terms of any subsequent version published by the license
 | 
				
			||||||
 | 
					steward.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					10.3. Modified Versions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If you create software not governed by this License, and you want to
 | 
				
			||||||
 | 
					create a new license for such software, you may create and use a
 | 
				
			||||||
 | 
					modified version of this License if you rename the license and remove
 | 
				
			||||||
 | 
					any references to the name of the license steward (except to note that
 | 
				
			||||||
 | 
					such modified license differs from this License).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					10.4. Distributing Source Code Form that is Incompatible With Secondary
 | 
				
			||||||
 | 
					Licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If You choose to distribute Source Code Form that is Incompatible With
 | 
				
			||||||
 | 
					Secondary Licenses under the terms of this version of the License, the
 | 
				
			||||||
 | 
					notice described in Exhibit B of this License must be attached.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Exhibit A - Source Code Form License Notice
 | 
				
			||||||
 | 
					-------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  This Source Code Form is subject to the terms of the Mozilla Public
 | 
				
			||||||
 | 
					  License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
				
			||||||
 | 
					  file, You can obtain one at http://mozilla.org/MPL/2.0/.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If it is not possible or desirable to put the notice in a particular
 | 
				
			||||||
 | 
					file, then You may include the notice in a location (such as a LICENSE
 | 
				
			||||||
 | 
					file in a relevant directory) where a recipient would be likely to look
 | 
				
			||||||
 | 
					for such a notice.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You may add additional accurate notices of copyright ownership.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Exhibit B - "Incompatible With Secondary Licenses" Notice
 | 
				
			||||||
 | 
					---------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  This Source Code Form is "Incompatible With Secondary Licenses", as
 | 
				
			||||||
 | 
					  defined by the Mozilla Public License, v. 2.0.
 | 
				
			||||||
							
								
								
									
										11
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					# Elna programming language
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Elna is a simple, imperative, low-level programming language.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					It is intendet to accompany other languages in the areas, where a high-level
 | 
				
			||||||
 | 
					language doesn't fit well. It is also supposed to be an intermediate
 | 
				
			||||||
 | 
					representation for a such high-level hypothetical programming language.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## File extension
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.elna
 | 
				
			||||||
							
								
								
									
										420
									
								
								asm-boot.s
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										420
									
								
								asm-boot.s
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,420 @@
 | 
				
			|||||||
 | 
					# s1 - Contains the current position in the source text.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.equ SYS_READ, 63
 | 
				
			||||||
 | 
					.equ SYS_WRITE, 64
 | 
				
			||||||
 | 
					.equ SYS_EXIT, 93
 | 
				
			||||||
 | 
					.equ STDIN, 0
 | 
				
			||||||
 | 
					.equ STDOUT, 1
 | 
				
			||||||
 | 
					.equ STDERR, 2
 | 
				
			||||||
 | 
					.equ SOURCE_BUFFER_SIZE, 2048
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					asm_program: .ascii ".bss\n.type source_code, @object\n.size source_code, 2048\nsource_code: .zero 2048\n"
 | 
				
			||||||
 | 
					.equ ASM_PROGRAM_SIZE, . - asm_program
 | 
				
			||||||
 | 
					asm_begin: .ascii ".text\n.global _start\n_start:\n\taddi a0, zero, 0\n\tla a1, source_code\n\tli a2, 2048\n\taddi a7, zero, 63\n\tecall\n"
 | 
				
			||||||
 | 
					.equ ASM_BEGIN_SIZE, . - asm_begin
 | 
				
			||||||
 | 
					asm_end: .ascii "\taddi a0, zero, 0\n\taddi a7, zero, 93\n\tecall\n"
 | 
				
			||||||
 | 
					.equ ASM_END_SIZE, . - asm_end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					token_begin: .string "begin"
 | 
				
			||||||
 | 
					token_end: .string "end"
 | 
				
			||||||
 | 
					token_import: .string "import"
 | 
				
			||||||
 | 
					token_dot: .string "."
 | 
				
			||||||
 | 
					token_comma: .string ","
 | 
				
			||||||
 | 
					token_assign: .string ":="
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.bss
 | 
				
			||||||
 | 
					.type source_code, @object
 | 
				
			||||||
 | 
					.size source_code, SOURCE_BUFFER_SIZE
 | 
				
			||||||
 | 
					source_code: .zero SOURCE_BUFFER_SIZE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.text
 | 
				
			||||||
 | 
					.global _start # Program entry point.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.type _skip_spaces, @function
 | 
				
			||||||
 | 
					_skip_spaces:
 | 
				
			||||||
 | 
					.Lspace_loop_do:
 | 
				
			||||||
 | 
						lbu t0, (s1) # t0 = Current character.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						li t1, ' '
 | 
				
			||||||
 | 
						beq t0, t1, .Lspace_loop_repeat
 | 
				
			||||||
 | 
						li t1, '\t'
 | 
				
			||||||
 | 
						beq t0, t1, .Lspace_loop_repeat
 | 
				
			||||||
 | 
						li t1, '\n'
 | 
				
			||||||
 | 
						beq t0, t1, .Lspace_loop_repeat
 | 
				
			||||||
 | 
						li t1, '\r'
 | 
				
			||||||
 | 
						beq t0, t1, .Lspace_loop_repeat
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						j .Lspace_loop_end
 | 
				
			||||||
 | 
					.Lspace_loop_repeat:
 | 
				
			||||||
 | 
						addi s1, s1, 1
 | 
				
			||||||
 | 
						j .Lspace_loop_do
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.Lspace_loop_end:
 | 
				
			||||||
 | 
						ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Compares two string, which of one has a length, the other one is null-terminated.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# a0 - The address of the token string.
 | 
				
			||||||
 | 
					# a1 - The length of the string in a0.
 | 
				
			||||||
 | 
					# a2 - The address of the null-terminated string.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# If the strings match sets a0 to 0, otherwise sets it to 1.
 | 
				
			||||||
 | 
					.type _token_compare, @function
 | 
				
			||||||
 | 
					_token_compare:
 | 
				
			||||||
 | 
						addi t0, a0, 0
 | 
				
			||||||
 | 
						addi t1, a1, 0
 | 
				
			||||||
 | 
						addi t2, a2, 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.Ltoken_compare_loop:
 | 
				
			||||||
 | 
						lbu t3, (t2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Will only be 0 if the current character in the null terminated string is \0 and the remaining length of the
 | 
				
			||||||
 | 
						# another string is 0.
 | 
				
			||||||
 | 
						or t4, t3, t1
 | 
				
			||||||
 | 
						beqz t4, .Ltoken_compare_equal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						beqz t1, .Ltoken_compare_not_equal
 | 
				
			||||||
 | 
						beqz t3, .Ltoken_compare_not_equal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						lbu t4, (t0)
 | 
				
			||||||
 | 
						bne t3, t4, .Ltoken_compare_not_equal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						addi t0, t0, 1
 | 
				
			||||||
 | 
						addi t1, t1, -1
 | 
				
			||||||
 | 
						addi t2, t2, 1
 | 
				
			||||||
 | 
						j .Ltoken_compare_loop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.Ltoken_compare_not_equal:
 | 
				
			||||||
 | 
						li a0, 1
 | 
				
			||||||
 | 
						j .Ltoken_compare_end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.Ltoken_compare_equal:
 | 
				
			||||||
 | 
						li a0, 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.Ltoken_compare_end:
 | 
				
			||||||
 | 
						ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Detects if the passed character is a 7-bit alpha character or an underscore.
 | 
				
			||||||
 | 
					# The character is passed in a0.
 | 
				
			||||||
 | 
					# Sets a0 to 1 if the character is an alpha character or underscore, sets it to 0 otherwise.
 | 
				
			||||||
 | 
					.type _is_alpha, @function
 | 
				
			||||||
 | 
					_is_alpha:
 | 
				
			||||||
 | 
						li t0, 'A' - 1
 | 
				
			||||||
 | 
						sltu t1, t0, a0 # t1 = a0 >= 'A'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sltiu t2, a0, 'Z' + 1 # t2 = a0 <= 'Z'
 | 
				
			||||||
 | 
						and t1, t1, t2 # t1 = a0 >= 'A' & a0 <= 'Z'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						li t0, 'a' - 1
 | 
				
			||||||
 | 
						sltu t2, t0, a0 # t2 = a0 >= 'a'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sltiu t3, a0, 'z' + 1 # t3 = a0 <= 'z'
 | 
				
			||||||
 | 
						and t2, t2, t3 # t2 = a0 >= 'a' & a0 <= 'z'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						xori t3, a0, '_'
 | 
				
			||||||
 | 
						seqz t3, t3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						or a0, t1, t2
 | 
				
			||||||
 | 
						or a0, a0, t3
 | 
				
			||||||
 | 
						ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.type _is_digit, @function
 | 
				
			||||||
 | 
					_is_digit:
 | 
				
			||||||
 | 
						li t0, '0' - 1
 | 
				
			||||||
 | 
						sltu t1, t0, a0 # t1 = a0 >= '0'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sltiu t2, a0, '9' + 1 # t2 = a0 <= '9'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						and a0, t1, t2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.type _is_alnum, @function
 | 
				
			||||||
 | 
					_is_alnum:
 | 
				
			||||||
 | 
						# Prologue.
 | 
				
			||||||
 | 
						addi sp, sp, -16
 | 
				
			||||||
 | 
						sw ra, 12(sp)
 | 
				
			||||||
 | 
						sw s0, 8(sp)
 | 
				
			||||||
 | 
						addi s0, sp, 16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sw a0, 4(sp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						call _is_alpha
 | 
				
			||||||
 | 
						sw a0, 0(sp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						lw a0, 4(sp)
 | 
				
			||||||
 | 
						call _is_digit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						lw a1, 0(sp)
 | 
				
			||||||
 | 
						or a0, a0, a1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Epilogue.
 | 
				
			||||||
 | 
						lw ra, 12(sp)
 | 
				
			||||||
 | 
						lw s0, 8(sp)
 | 
				
			||||||
 | 
						addi sp, sp, 16
 | 
				
			||||||
 | 
						ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Reads a token and returns its length in a0.
 | 
				
			||||||
 | 
					.type _read_token, @function
 | 
				
			||||||
 | 
					_read_token:
 | 
				
			||||||
 | 
						# Prologue.
 | 
				
			||||||
 | 
						addi sp, sp, -16
 | 
				
			||||||
 | 
						sw ra, 12(sp)
 | 
				
			||||||
 | 
						sw s0, 8(sp)
 | 
				
			||||||
 | 
						addi s0, sp, 16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						lbu t0, (s1) # t0 = Current character.
 | 
				
			||||||
 | 
						sw zero, 4(sp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						li t1, '.'
 | 
				
			||||||
 | 
						beq t0, t1, .Ltoken_character_single
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						li t1, ','
 | 
				
			||||||
 | 
						beq t0, t1, .Ltoken_character_single
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						li t1, ':'
 | 
				
			||||||
 | 
						beq t0, t1, .Ltoken_character_colon
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						li t1, ';'
 | 
				
			||||||
 | 
						beq t0, t1, .Ltoken_character_single
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						li t1, '('
 | 
				
			||||||
 | 
						beq t0, t1, .Ltoken_character_single
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						li t1, ')'
 | 
				
			||||||
 | 
						beq t0, t1, .Ltoken_character_single
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						li t1, '['
 | 
				
			||||||
 | 
						beq t0, t1, .Ltoken_character_single
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						li t1, ']'
 | 
				
			||||||
 | 
						beq t0, t1, .Ltoken_character_single
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.Ltoken_character_loop_do: # Expect an identifier or a number.
 | 
				
			||||||
 | 
						lw t6, 4(sp)
 | 
				
			||||||
 | 
						add t1, s1, t6
 | 
				
			||||||
 | 
						lbu a0, (t1) # a0 = Current character.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						call _is_alnum
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						beqz a0, .Ltoken_character_end
 | 
				
			||||||
 | 
						lw t6, 4(sp)
 | 
				
			||||||
 | 
						addi t6, t6, 1
 | 
				
			||||||
 | 
						sw t6, 4(sp)
 | 
				
			||||||
 | 
						j .Ltoken_character_loop_do
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.Ltoken_character_single:
 | 
				
			||||||
 | 
						lw t6, 4(sp)
 | 
				
			||||||
 | 
						addi t6, t6, 1
 | 
				
			||||||
 | 
						sw t6, 4(sp)
 | 
				
			||||||
 | 
						j .Ltoken_character_end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.Ltoken_character_colon:
 | 
				
			||||||
 | 
						lbu t0, 1(s1) # t0 = The character after the colon.
 | 
				
			||||||
 | 
						lw t6, 4(sp)
 | 
				
			||||||
 | 
						addi t6, t6, 1
 | 
				
			||||||
 | 
						sw t6, 4(sp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						li t1, '='
 | 
				
			||||||
 | 
						beq t0, t1, .Ltoken_character_single
 | 
				
			||||||
 | 
						j .Ltoken_character_end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.Ltoken_character_end:
 | 
				
			||||||
 | 
						lw a0, 4(sp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Epilogue.
 | 
				
			||||||
 | 
						lw ra, 12(sp)
 | 
				
			||||||
 | 
						lw s0, 8(sp)
 | 
				
			||||||
 | 
						addi sp, sp, 16
 | 
				
			||||||
 | 
						ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Generate entry point symbol.
 | 
				
			||||||
 | 
					.type _compile_begin, @function
 | 
				
			||||||
 | 
					_compile_begin:
 | 
				
			||||||
 | 
						# Write initial assembler.
 | 
				
			||||||
 | 
						addi a0, zero, STDOUT
 | 
				
			||||||
 | 
						la a1, asm_begin
 | 
				
			||||||
 | 
						addi a2, zero, ASM_BEGIN_SIZE
 | 
				
			||||||
 | 
						addi a7, zero, SYS_WRITE
 | 
				
			||||||
 | 
						ecall
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						addi s1, s1, 5
 | 
				
			||||||
 | 
						ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Generate program termination code.
 | 
				
			||||||
 | 
					.type _compile_end, @function
 | 
				
			||||||
 | 
					_compile_end:
 | 
				
			||||||
 | 
						# Write closing assembler.
 | 
				
			||||||
 | 
						addi a0, zero, STDOUT
 | 
				
			||||||
 | 
						la a1, asm_end
 | 
				
			||||||
 | 
						addi a2, zero, ASM_END_SIZE
 | 
				
			||||||
 | 
						addi a7, zero, SYS_WRITE
 | 
				
			||||||
 | 
						ecall
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						addi s1, s1, 3
 | 
				
			||||||
 | 
						ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Ignores the import.
 | 
				
			||||||
 | 
					.type _compile_import, @function
 | 
				
			||||||
 | 
					_compile_import:
 | 
				
			||||||
 | 
						# Prologue.
 | 
				
			||||||
 | 
						addi sp, sp, -8
 | 
				
			||||||
 | 
						sw ra, 4(sp)
 | 
				
			||||||
 | 
						sw s0, 0(sp)
 | 
				
			||||||
 | 
						addi s0, sp, 8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						addi s1, s1, 6
 | 
				
			||||||
 | 
						call _skip_spaces
 | 
				
			||||||
 | 
						call _read_token
 | 
				
			||||||
 | 
						add s1, s1, a0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Epilogue.
 | 
				
			||||||
 | 
						lw ra, 4(sp)
 | 
				
			||||||
 | 
						lw s0, 0(sp)
 | 
				
			||||||
 | 
						addi sp, sp, 8
 | 
				
			||||||
 | 
						ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.type _compile_identifier, @function
 | 
				
			||||||
 | 
					_compile_identifier:
 | 
				
			||||||
 | 
						# Prologue.
 | 
				
			||||||
 | 
						addi sp, sp, -16
 | 
				
			||||||
 | 
						sw ra, 12(sp)
 | 
				
			||||||
 | 
						sw s0, 8(sp)
 | 
				
			||||||
 | 
						addi s0, sp, 16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Epilogue.
 | 
				
			||||||
 | 
						lw ra, 28(sp)
 | 
				
			||||||
 | 
						lw s0, 24(sp)
 | 
				
			||||||
 | 
						addi sp, sp, 32
 | 
				
			||||||
 | 
						ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.type _handle_token, @function
 | 
				
			||||||
 | 
					_handle_token:
 | 
				
			||||||
 | 
						# Prologue.
 | 
				
			||||||
 | 
						addi sp, sp, -32
 | 
				
			||||||
 | 
						sw ra, 28(sp)
 | 
				
			||||||
 | 
						sw s0, 24(sp)
 | 
				
			||||||
 | 
						addi s0, sp, 32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sw a0, 20(sp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Detect what token has been read.
 | 
				
			||||||
 | 
						addi a0, s1, 0
 | 
				
			||||||
 | 
						lw a1, 20(sp)
 | 
				
			||||||
 | 
						la a2, token_begin
 | 
				
			||||||
 | 
						call _token_compare
 | 
				
			||||||
 | 
						beqz a0, .Lhandle_token_begin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						addi a0, s1, 0
 | 
				
			||||||
 | 
						lw a1, 20(sp)
 | 
				
			||||||
 | 
						la a2, token_end
 | 
				
			||||||
 | 
						call _token_compare
 | 
				
			||||||
 | 
						beqz a0, .Lhandle_token_end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						addi a0, s1, 0
 | 
				
			||||||
 | 
						lw a1, 20(sp)
 | 
				
			||||||
 | 
						la a2, token_import
 | 
				
			||||||
 | 
						call _token_compare
 | 
				
			||||||
 | 
						beqz a0, .Lhandle_token_import
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# If the first symbol in the token is a character, assume and identifier.
 | 
				
			||||||
 | 
						addi a0, s1, 0
 | 
				
			||||||
 | 
						lw a0, (a0)
 | 
				
			||||||
 | 
						call _is_alpha
 | 
				
			||||||
 | 
						bnez a0, .Lhandle_token_identifier
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Ignore the unknown token.
 | 
				
			||||||
 | 
						lw t0, 20(sp)
 | 
				
			||||||
 | 
						add s1, s1, t0
 | 
				
			||||||
 | 
						j .Lhandle_token_return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.Lhandle_token_begin:
 | 
				
			||||||
 | 
						call _compile_begin
 | 
				
			||||||
 | 
						j .Lhandle_token_return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.Lhandle_token_end:
 | 
				
			||||||
 | 
						call _compile_end
 | 
				
			||||||
 | 
						j .Lhandle_token_return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.Lhandle_token_import:
 | 
				
			||||||
 | 
						call _compile_import
 | 
				
			||||||
 | 
						j .Lhandle_token_return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.Lhandle_token_identifier:
 | 
				
			||||||
 | 
						addi a0, s1, 0
 | 
				
			||||||
 | 
						lw a1, 20(sp)
 | 
				
			||||||
 | 
						call _compile_identifier
 | 
				
			||||||
 | 
						j .Lhandle_token_return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.Lhandle_token_return:
 | 
				
			||||||
 | 
						# Epilogue.
 | 
				
			||||||
 | 
						lw ra, 28(sp)
 | 
				
			||||||
 | 
						lw s0, 24(sp)
 | 
				
			||||||
 | 
						addi sp, sp, 32
 | 
				
			||||||
 | 
						ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.type _compile, @function
 | 
				
			||||||
 | 
					_compile:
 | 
				
			||||||
 | 
						# Prologue.
 | 
				
			||||||
 | 
						addi sp, sp, -16
 | 
				
			||||||
 | 
						sw ra, 12(sp)
 | 
				
			||||||
 | 
						sw s0, 8(sp)
 | 
				
			||||||
 | 
						addi s0, sp, 16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						la s1, source_code # s1 = Source code position.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Write .bss section header for global variables.
 | 
				
			||||||
 | 
						addi a0, zero, STDOUT
 | 
				
			||||||
 | 
						la a1, asm_program
 | 
				
			||||||
 | 
						addi a2, zero, ASM_PROGRAM_SIZE
 | 
				
			||||||
 | 
						addi a7, zero, SYS_WRITE
 | 
				
			||||||
 | 
						ecall
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						call _skip_spaces
 | 
				
			||||||
 | 
						addi s1, s1, 7 # Skip "program" keyword.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.Lcharacter_loop_do:
 | 
				
			||||||
 | 
						call _skip_spaces
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						lbu t0, (s1) # t0 = Current character.
 | 
				
			||||||
 | 
						beqz t0, .Lcharacter_loop_end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						call _read_token
 | 
				
			||||||
 | 
						sw a0, 4(sp) # Save the token length on the stack.
 | 
				
			||||||
 | 
						beqz a0, .Lcharacter_loop_end # No token read, there is unrecognized input.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Write the current token to stderr.
 | 
				
			||||||
 | 
						addi a0, zero, STDERR
 | 
				
			||||||
 | 
						addi a1, s1, 0
 | 
				
			||||||
 | 
						lw a2, 4(sp)
 | 
				
			||||||
 | 
						addi a7, zero, SYS_WRITE
 | 
				
			||||||
 | 
						ecall
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						lw a0, 4(sp)
 | 
				
			||||||
 | 
						call _handle_token
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						j .Lcharacter_loop_do
 | 
				
			||||||
 | 
					.Lcharacter_loop_end:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Epilogue.
 | 
				
			||||||
 | 
						lw ra, 12(sp)
 | 
				
			||||||
 | 
						lw s0, 8(sp)
 | 
				
			||||||
 | 
						addi sp, sp, 16
 | 
				
			||||||
 | 
						ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_start:
 | 
				
			||||||
 | 
						# Read the source from the standard input.
 | 
				
			||||||
 | 
						addi a0, zero, STDIN
 | 
				
			||||||
 | 
						la a1, source_code
 | 
				
			||||||
 | 
						li a2, SOURCE_BUFFER_SIZE # Buffer size.
 | 
				
			||||||
 | 
						addi a7, zero, SYS_READ
 | 
				
			||||||
 | 
						ecall
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						call _compile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Call exit.
 | 
				
			||||||
 | 
						addi a0, zero, 0   # Use 0 return code.
 | 
				
			||||||
 | 
						addi a7, zero, SYS_EXIT
 | 
				
			||||||
 | 
						ecall
 | 
				
			||||||
							
								
								
									
										37
									
								
								run.rb
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										37
									
								
								run.rb
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,37 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env ruby
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require 'open3'
 | 
				
			||||||
 | 
					require 'fileutils'
 | 
				
			||||||
 | 
					require 'pathname'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TMP = Pathname.new 'build'
 | 
				
			||||||
 | 
					CROSS_GCC = '../riscv32-ilp32d--glibc/bin/riscv32-linux-gcc'
 | 
				
			||||||
 | 
					SYSROOT = '../riscv32-ilp32d--glibc/riscv32-buildroot-linux-gnu/sysroot'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FileUtils.rm_rf TMP
 | 
				
			||||||
 | 
					FileUtils.mkdir_p TMP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FileUtils.cp 'asm-boot.s', TMP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def stage(source_elna, stage_name, output)
 | 
				
			||||||
 | 
					  boot_exe = (TMP + stage_name).to_path
 | 
				
			||||||
 | 
					  stage_path = TMP + "#{stage_name}.s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  system CROSS_GCC, '-nostdlib', '-o', boot_exe, stage_path.to_path, exception: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Open3.popen2 'qemu-riscv32', '-L', SYSROOT, boot_exe do |qemu_in, qemu_out|
 | 
				
			||||||
 | 
					    qemu_in.write source_elna
 | 
				
			||||||
 | 
					    qemu_in.close
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IO.copy_stream qemu_out, output
 | 
				
			||||||
 | 
					    qemu_out.close
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					source_elna = File.read 'source.elna'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					next_stage = TMP + 'goto-boot.s'
 | 
				
			||||||
 | 
					File.open next_stage, 'w' do |output|
 | 
				
			||||||
 | 
					  stage source_elna, 'asm-boot', output
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					stage(source_elna, 'goto-boot', $stdout)
 | 
				
			||||||
							
								
								
									
										9
									
								
								source.elna
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								source.elna
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					program
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import dummy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					  init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  s1 := source_code;
 | 
				
			||||||
 | 
					end.
 | 
				
			||||||
		Reference in New Issue
	
	Block a user