170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* ansi2knr.c */ 270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Convert ANSI C function definitions to K&R ("traditional C") syntax */ 370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineansi2knr is distributed in the hope that it will be useful, but WITHOUT ANY 670a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineWARRANTY. No author or distributor accepts responsibility to anyone for the 770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineconsequences of using it or for whether it serves any particular purpose or 870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineworks at all, unless he says so in writing. Refer to the GNU General Public 970a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLicense (the "GPL") for full details. 1070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 1170a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineEveryone is granted permission to copy, modify and redistribute ansi2knr, 1270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinebut only under the conditions described in the GPL. A copy of this license 1370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineis supposed to have been given to you along with ansi2knr so you can know 1470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineyour rights and responsibilities. It should be in a file named COPYLEFT. 1570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine[In the IJG distribution, the GPL appears below, not in a separate file.] 1670a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineAmong other things, the copyright notice and this notice must be preserved 1770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineon all copies. 1870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 1970a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineWe explicitly state here what we believe is already implied by the GPL: if 2070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinethe ansi2knr program is distributed as a separate set of sources and a 2170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineseparate executable file which are aggregated on a storage medium together 2270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinewith another program, this in itself does not bring the other program under 2370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinethe GPL, nor does the mere fact that such a program or the procedures for 2470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineconstructing it invoke the ansi2knr executable bring any other part of the 2570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineprogram under the GPL. 2670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine*/ 2770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 2870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 2970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine---------- Here is the GNU GPL file COPYLEFT, referred to above ---------- 3070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine----- These terms do NOT apply to the JPEG software itself; see README ------ 3170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 3270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine GHOSTSCRIPT GENERAL PUBLIC LICENSE 3370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (Clarified 11 Feb 1988) 3470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 3570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine Copyright (C) 1988 Richard M. Stallman 3670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine Everyone is permitted to copy and distribute verbatim copies of this 3770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine license, but changing it is not allowed. You can also use this wording 3870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine to make the terms for other programs. 3970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 4070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine The license agreements of most software companies keep you at the 4170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinemercy of those companies. By contrast, our general public license is 4270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineintended to give everyone the right to share Ghostscript. To make sure 4370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinethat you get the rights we want you to have, we need to make 4470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinerestrictions that forbid anyone to deny you these rights or to ask you 4570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineto surrender the rights. Hence this license agreement. 4670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 4770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine Specifically, we want to make sure that you have the right to give 4870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineaway copies of Ghostscript, that you receive source code or else can get 4970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineit if you want it, that you can change Ghostscript or use pieces of it 5070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinein new free programs, and that you know you can do these things. 5170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 5270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine To make sure that everyone has such rights, we have to forbid you to 5370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinedeprive anyone else of these rights. For example, if you distribute 5470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinecopies of Ghostscript, you must give the recipients all the rights that 5570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineyou have. You must make sure that they, too, receive or can get the 5670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinesource code. And you must tell them their rights. 5770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 5870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine Also, for our own protection, we must make certain that everyone finds 5970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineout that there is no warranty for Ghostscript. If Ghostscript is 6070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinemodified by someone else and passed on, we want its recipients to know 6170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinethat what they have is not what we distributed, so that any problems 6270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineintroduced by others will not reflect on our reputation. 6370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 6470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine Therefore we (Richard M. Stallman and the Free Software Foundation, 6570a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineInc.) make the following terms which say what you must do to be allowed 6670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineto distribute or change Ghostscript. 6770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 6870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 6970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine COPYING POLICIES 7070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 7170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 1. You may copy and distribute verbatim copies of Ghostscript source 7270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinecode as you receive it, in any medium, provided that you conspicuously 7370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineand appropriately publish on each copy a valid copyright and license 7470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinenotice "Copyright (C) 1989 Aladdin Enterprises. All rights reserved. 7570a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineDistributed by Free Software Foundation, Inc." (or with whatever year is 7670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineappropriate); keep intact the notices on all files that refer to this 7770a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLicense Agreement and to the absence of any warranty; and give any other 7870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinerecipients of the Ghostscript program a copy of this License Agreement 7970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinealong with the program. You may charge a distribution fee for the 8070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinephysical act of transferring a copy. 8170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 8270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 2. You may modify your copy or copies of Ghostscript or any portion of 8370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineit, and copy and distribute such modifications under the terms of 8470a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineParagraph 1 above, provided that you also do the following: 8570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 8670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine a) cause the modified files to carry prominent notices stating 8770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine that you changed the files and the date of any change; and 8870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 8970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine b) cause the whole of any work that you distribute or publish, 9070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine that in whole or in part contains or is a derivative of Ghostscript 9170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine or any part thereof, to be licensed at no charge to all third 9270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine parties on terms identical to those contained in this License 9370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine Agreement (except that you may choose to grant more extensive 9470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine warranty protection to some or all third parties, at your option). 9570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 9670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine c) You may charge a distribution fee for the physical act of 9770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine transferring a copy, and you may at your option offer warranty 9870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine protection in exchange for a fee. 9970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 10070a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMere aggregation of another unrelated program with this program (or its 10170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinederivative) on a volume of a storage or distribution medium does not bring 10270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinethe other program under the scope of these terms. 10370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 10470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 3. You may copy and distribute Ghostscript (or a portion or derivative 10570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineof it, under Paragraph 2) in object code or executable form under the 10670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineterms of Paragraphs 1 and 2 above provided that you also do one of the 10770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinefollowing: 10870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 10970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine a) accompany it with the complete corresponding machine-readable 11070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source code, which must be distributed under the terms of 11170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine Paragraphs 1 and 2 above; or, 11270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 11370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine b) accompany it with a written offer, valid for at least three 11470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine years, to give any third party free (except for a nominal 11570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine shipping charge) a complete machine-readable copy of the 11670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine corresponding source code, to be distributed under the terms of 11770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine Paragraphs 1 and 2 above; or, 11870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 11970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine c) accompany it with the information you received as to where the 12070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine corresponding source code may be obtained. (This alternative is 12170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine allowed only for noncommercial distribution and only if you 12270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine received the program in object code or executable form alone.) 12370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 12470a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineFor an executable file, complete source code means all the source code for 12570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineall modules it contains; but, as a special exception, it need not include 12670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinesource code for modules which are standard libraries that accompany the 12770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineoperating system on which the executable file runs. 12870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 12970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 4. You may not copy, sublicense, distribute or transfer Ghostscript 13070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineexcept as expressly provided under this License Agreement. Any attempt 13170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineotherwise to copy, sublicense, distribute or transfer Ghostscript is 13270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinevoid and your rights to use the program under this License agreement 13370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineshall be automatically terminated. However, parties who have received 13470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinecomputer software programs from you with this License Agreement will not 13570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinehave their licenses terminated so long as such parties remain in full 13670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinecompliance. 13770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 13870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 5. If you wish to incorporate parts of Ghostscript into other free 13970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineprograms whose distribution conditions are different, write to the Free 14070a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineSoftware Foundation at 675 Mass Ave, Cambridge, MA 02139. We have not 14170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineyet worked out a simple rule that can be stated here, but we will often 14270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinepermit this. We will be guided by the two goals of preserving the free 14370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinestatus of all derivatives of our free software and of promoting the 14470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinesharing and reuse of software. 14570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 14670a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineYour comments and suggestions about our licensing policies and our 14770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinesoftware are welcome! Please contact the Free Software Foundation, 14870a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineInc., 675 Mass Ave, Cambridge, MA 02139, or call (617) 876-3296. 14970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 15070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine NO WARRANTY 15170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 15270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine BECAUSE GHOSTSCRIPT IS LICENSED FREE OF CHARGE, WE PROVIDE ABSOLUTELY 15370a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineNO WARRANTY, TO THE EXTENT PERMITTED BY APPLICABLE STATE LAW. EXCEPT 15470a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineWHEN OTHERWISE STATED IN WRITING, FREE SOFTWARE FOUNDATION, INC, RICHARD 15570a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineM. STALLMAN, ALADDIN ENTERPRISES, L. PETER DEUTSCH, AND/OR OTHER PARTIES 15670a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkinePROVIDE GHOSTSCRIPT "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER 15770a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineEXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 15870a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE 15970a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF GHOSTSCRIPT IS WITH 16070a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineYOU. SHOULD GHOSTSCRIPT PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL 16170a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineNECESSARY SERVICING, REPAIR OR CORRECTION. 16270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 16370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL RICHARD M. 16470a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineSTALLMAN, THE FREE SOFTWARE FOUNDATION, INC., L. PETER DEUTSCH, ALADDIN 16570a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineENTERPRISES, AND/OR ANY OTHER PARTY WHO MAY MODIFY AND REDISTRIBUTE 16670a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGHOSTSCRIPT AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING 16770a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineANY LOST PROFITS, LOST MONIES, OR OTHER SPECIAL, INCIDENTAL OR 16870a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE 16970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine(INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED 17070a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineINACCURATE OR LOSSES SUSTAINED BY THIRD PARTIES OR A FAILURE OF THE 17170a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkinePROGRAM TO OPERATE WITH ANY OTHER PROGRAMS) GHOSTSCRIPT, EVEN IF YOU 17270a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineHAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, OR FOR ANY CLAIM 17370a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineBY ANY OTHER PARTY. 17470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 17570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine-------------------- End of file COPYLEFT ------------------------------ 17670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine*/ 17770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 17870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 17970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Usage: 18070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ansi2knr input_file [output_file] 18170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * If no output_file is supplied, output goes to stdout. 18270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * There are no error messages. 18370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 18470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * ansi2knr recognizes function definitions by seeing a non-keyword 18570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * identifier at the left margin, followed by a left parenthesis, 18670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * with a right parenthesis as the last character on the line, 18770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * and with a left brace as the first token on the following line 18870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * (ignoring possible intervening comments). 18970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * It will recognize a multi-line header provided that no intervening 19070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * line ends with a left or right brace or a semicolon. 19170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * These algorithms ignore whitespace and comments, except that 19270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * the function name must be the first thing on the line. 19370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The following constructs will confuse it: 19470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * - Any other construct that starts at the left margin and 19570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * follows the above syntax (such as a macro or function call). 19670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * - Some macros that tinker with the syntax of the function header. 19770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 19870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 19970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 20070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The original and principal author of ansi2knr is L. Peter Deutsch 20170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * <ghost@aladdin.com>. Other authors are noted in the change history 20270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * that follows (in reverse chronological order): 20370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine lpd 96-01-21 added code to cope with not HAVE_CONFIG_H and with 20470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine compilers that don't understand void, as suggested by 20570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine Tom Lane 20670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine lpd 96-01-15 changed to require that the first non-comment token 20770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine on the line following a function header be a left brace, 20870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine to reduce sensitivity to macros, as suggested by Tom Lane 20970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine <tgl@sss.pgh.pa.us> 21070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine lpd 95-06-22 removed #ifndefs whose sole purpose was to define 21170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine undefined preprocessor symbols as 0; changed all #ifdefs 21270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for configuration symbols to #ifs 21370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine lpd 95-04-05 changed copyright notice to make it clear that 21470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine including ansi2knr in a program does not bring the entire 21570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine program under the GPL 21670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine lpd 94-12-18 added conditionals for systems where ctype macros 21770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine don't handle 8-bit characters properly, suggested by 21870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine Francois Pinard <pinard@iro.umontreal.ca>; 21970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine removed --varargs switch (this is now the default) 22070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine lpd 94-10-10 removed CONFIG_BROKETS conditional 22170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine lpd 94-07-16 added some conditionals to help GNU `configure', 22270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine suggested by Francois Pinard <pinard@iro.umontreal.ca>; 22370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine properly erase prototype args in function parameters, 22470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine contributed by Jim Avera <jima@netcom.com>; 22570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine correct error in writeblanks (it shouldn't erase EOLs) 22670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine lpd 89-xx-xx original version 22770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 22870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 22970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Most of the conditionals here are to make ansi2knr work with */ 23070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* or without the GNU configure machinery. */ 23170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 23270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#if HAVE_CONFIG_H 23370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# include <config.h> 23470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 23570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 23670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include <stdio.h> 23770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include <ctype.h> 23870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 23970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#if HAVE_CONFIG_H 24070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 24170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 24270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine For properly autoconfiguring ansi2knr, use AC_CONFIG_HEADER(config.h). 24370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine This will define HAVE_CONFIG_H and so, activate the following lines. 24470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 24570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 24670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# if STDC_HEADERS || HAVE_STRING_H 24770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# include <string.h> 24870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# else 24970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# include <strings.h> 25070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# endif 25170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 25270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else /* not HAVE_CONFIG_H */ 25370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 25470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Otherwise do it the hard way */ 25570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 25670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# ifdef BSD 25770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# include <strings.h> 25870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# else 25970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# ifdef VMS 26070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine extern int strlen(), strncmp(); 26170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# else 26270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# include <string.h> 26370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# endif 26470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# endif 26570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 26670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif /* not HAVE_CONFIG_H */ 26770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 26870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#if STDC_HEADERS 26970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# include <stdlib.h> 27070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else 27170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 27270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine malloc and free should be declared in stdlib.h, 27370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine but if you've got a K&R compiler, they probably aren't. 27470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 27570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# ifdef MSDOS 27670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# include <malloc.h> 27770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# else 27870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# ifdef VMS 27970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine extern char *malloc(); 28070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine extern void free(); 28170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# else 28270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine extern char *malloc(); 28370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine extern int free(); 28470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# endif 28570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# endif 28670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 28770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 28870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 28970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 29070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The ctype macros don't always handle 8-bit characters correctly. 29170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Compensate for this here. 29270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 29370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef isascii 29470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# undef HAVE_ISASCII /* just in case */ 29570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# define HAVE_ISASCII 1 29670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else 29770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 29870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#if STDC_HEADERS || !HAVE_ISASCII 29970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# define is_ascii(c) 1 30070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else 30170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine# define is_ascii(c) isascii(c) 30270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 30370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 30470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define is_space(c) (is_ascii(c) && isspace(c)) 30570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define is_alpha(c) (is_ascii(c) && isalpha(c)) 30670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define is_alnum(c) (is_ascii(c) && isalnum(c)) 30770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 30870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Scanning macros */ 30970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define isidchar(ch) (is_alnum(ch) || (ch) == '_') 31070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define isidfirstchar(ch) (is_alpha(ch) || (ch) == '_') 31170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 31270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Forward references */ 31370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinechar *skipspace(); 31470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineint writeblanks(); 31570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineint test1(); 31670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineint convert1(); 31770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 31870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* The main program */ 31970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineint 32070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinemain(argc, argv) 32170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int argc; 32270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char *argv[]; 32370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ FILE *in, *out; 32470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define bufsize 5000 /* arbitrary size */ 32570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char *buf; 32670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char *line; 32770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char *more; 32870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* 32970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * In previous versions, ansi2knr recognized a --varargs switch. 33070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * If this switch was supplied, ansi2knr would attempt to convert 33170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * a ... argument to va_alist and va_dcl; if this switch was not 33270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * supplied, ansi2knr would simply drop any such arguments. 33370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Now, ansi2knr always does this conversion, and we only 33470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * check for this switch for backward compatibility. 33570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 33670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int convert_varargs = 1; 33770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 33870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( argc > 1 && argv[1][0] == '-' ) 33970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { if ( !strcmp(argv[1], "--varargs") ) 34070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { convert_varargs = 1; 34170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine argc--; 34270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine argv++; 34370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 34470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine else 34570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { fprintf(stderr, "Unrecognized switch: %s\n", argv[1]); 34670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine exit(1); 34770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 34870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 34970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine switch ( argc ) 35070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { 35170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine default: 35270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine printf("Usage: ansi2knr input_file [output_file]\n"); 35370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine exit(0); 35470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case 2: 35570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine out = stdout; 35670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 35770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case 3: 35870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine out = fopen(argv[2], "w"); 35970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( out == NULL ) 36070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { fprintf(stderr, "Cannot open output file %s\n", argv[2]); 36170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine exit(1); 36270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 36370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 36470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine in = fopen(argv[1], "r"); 36570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( in == NULL ) 36670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { fprintf(stderr, "Cannot open input file %s\n", argv[1]); 36770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine exit(1); 36870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 36970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(out, "#line 1 \"%s\"\n", argv[1]); 37070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine buf = malloc(bufsize); 37170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine line = buf; 37270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine while ( fgets(line, (unsigned)(buf + bufsize - line), in) != NULL ) 37370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { 37470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetest: line += strlen(line); 37570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine switch ( test1(buf) ) 37670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { 37770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case 2: /* a function header */ 37870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine convert1(buf, out, 1, convert_varargs); 37970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 38070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case 1: /* a function */ 38170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Check for a { at the start of the next line. */ 38270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine more = ++line; 38370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinef: if ( line >= buf + (bufsize - 1) ) /* overflow check */ 38470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine goto wl; 38570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( fgets(line, (unsigned)(buf + bufsize - line), in) == NULL ) 38670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine goto wl; 38770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine switch ( *skipspace(more, 1) ) 38870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { 38970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case '{': 39070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Definitely a function header. */ 39170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine convert1(buf, out, 0, convert_varargs); 39270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fputs(more, out); 39370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 39470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case 0: 39570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* The next line was blank or a comment: */ 39670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* keep scanning for a non-comment. */ 39770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine line += strlen(line); 39870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine goto f; 39970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine default: 40070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* buf isn't a function header, but */ 40170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* more might be. */ 40270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fputs(buf, out); 40370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine strcpy(buf, more); 40470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine line = buf; 40570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine goto test; 40670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 40770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 40870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case -1: /* maybe the start of a function */ 40970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( line != buf + (bufsize - 1) ) /* overflow check */ 41070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine continue; 41170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* falls through */ 41270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine default: /* not a function */ 41370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinewl: fputs(buf, out); 41470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 41570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 41670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine line = buf; 41770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 41870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( line != buf ) 41970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fputs(buf, out); 42070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine free(buf); 42170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fclose(out); 42270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fclose(in); 42370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return 0; 42470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 42570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 42670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Skip over space and comments, in either direction. */ 42770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinechar * 42870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineskipspace(p, dir) 42970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register char *p; 43070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register int dir; /* 1 for forward, -1 for backward */ 43170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ for ( ; ; ) 43270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { while ( is_space(*p) ) 43370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine p += dir; 43470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( !(*p == '/' && p[dir] == '*') ) 43570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 43670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine p += dir; p += dir; 43770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine while ( !(*p == '*' && p[dir] == '/') ) 43870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { if ( *p == 0 ) 43970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return p; /* multi-line comment?? */ 44070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine p += dir; 44170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 44270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine p += dir; p += dir; 44370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 44470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return p; 44570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 44670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 44770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 44870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Write blanks over part of a string. 44970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Don't overwrite end-of-line characters. 45070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 45170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineint 45270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinewriteblanks(start, end) 45370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char *start; 45470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char *end; 45570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ char *p; 45670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for ( p = start; p < end; p++ ) 45770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( *p != '\r' && *p != '\n' ) 45870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *p = ' '; 45970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return 0; 46070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 46170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 46270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 46370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Test whether the string in buf is a function definition. 46470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The string may contain and/or end with a newline. 46570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Return as follows: 46670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 0 - definitely not a function definition; 46770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 1 - definitely a function definition; 46870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 2 - definitely a function prototype (NOT USED); 46970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * -1 - may be the beginning of a function definition, 47070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * append another line and look again. 47170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The reason we don't attempt to convert function prototypes is that 47270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Ghostscript's declaration-generating macros look too much like 47370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * prototypes, and confuse the algorithms. 47470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 47570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineint 47670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetest1(buf) 47770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char *buf; 47870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ register char *p = buf; 47970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char *bend; 48070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char *endfn; 48170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int contin; 48270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 48370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( !isidfirstchar(*p) ) 48470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return 0; /* no name at left margin */ 48570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine bend = skipspace(buf + strlen(buf) - 1, -1); 48670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine switch ( *bend ) 48770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { 48870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case ';': contin = 0 /*2*/; break; 48970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case ')': contin = 1; break; 49070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case '{': return 0; /* not a function */ 49170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case '}': return 0; /* not a function */ 49270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine default: contin = -1; 49370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 49470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine while ( isidchar(*p) ) 49570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine p++; 49670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine endfn = p; 49770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine p = skipspace(p, 1); 49870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( *p++ != '(' ) 49970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return 0; /* not a function */ 50070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine p = skipspace(p, 1); 50170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( *p == ')' ) 50270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return 0; /* no parameters */ 50370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Check that the apparent function name isn't a keyword. */ 50470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* We only need to check for keywords that could be followed */ 50570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* by a left parenthesis (which, unfortunately, is most of them). */ 50670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { static char *words[] = 50770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { "asm", "auto", "case", "char", "const", "double", 50870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine "extern", "float", "for", "if", "int", "long", 50970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine "register", "return", "short", "signed", "sizeof", 51070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine "static", "switch", "typedef", "unsigned", 51170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine "void", "volatile", "while", 0 51270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine }; 51370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char **key = words; 51470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char *kp; 51570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int len = endfn - buf; 51670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 51770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine while ( (kp = *key) != 0 ) 51870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { if ( strlen(kp) == len && !strncmp(kp, buf, len) ) 51970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return 0; /* name is a keyword */ 52070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine key++; 52170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 52270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 52370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return contin; 52470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 52570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 52670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Convert a recognized function definition or header to K&R syntax. */ 52770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineint 52870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineconvert1(buf, out, header, convert_varargs) 52970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char *buf; 53070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine FILE *out; 53170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int header; /* Boolean */ 53270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int convert_varargs; /* Boolean */ 53370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ char *endfn; 53470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register char *p; 53570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char **breaks; 53670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine unsigned num_breaks = 2; /* for testing */ 53770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char **btop; 53870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char **bp; 53970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char **ap; 54070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char *vararg = 0; 54170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 54270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Pre-ANSI implementations don't agree on whether strchr */ 54370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* is called strchr or index, so we open-code it here. */ 54470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for ( endfn = buf; *(endfn++) != '('; ) 54570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ; 54670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetop: p = endfn; 54770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine breaks = (char **)malloc(sizeof(char *) * num_breaks * 2); 54870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( breaks == 0 ) 54970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { /* Couldn't allocate break table, give up */ 55070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "Unable to allocate break table!\n"); 55170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fputs(buf, out); 55270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return -1; 55370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 55470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine btop = breaks + num_breaks * 2 - 2; 55570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine bp = breaks; 55670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Parse the argument list */ 55770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine do 55870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { int level = 0; 55970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char *lp = NULL; 56070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char *rp; 56170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char *end = NULL; 56270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 56370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( bp >= btop ) 56470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { /* Filled up break table. */ 56570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Allocate a bigger one and start over. */ 56670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine free((char *)breaks); 56770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine num_breaks <<= 1; 56870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine goto top; 56970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 57070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *bp++ = p; 57170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Find the end of the argument */ 57270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for ( ; end == NULL; p++ ) 57370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { switch(*p) 57470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { 57570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case ',': 57670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( !level ) end = p; 57770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 57870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case '(': 57970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( !level ) lp = p; 58070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine level++; 58170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 58270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case ')': 58370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( --level < 0 ) end = p; 58470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine else rp = p; 58570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 58670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case '/': 58770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine p = skipspace(p, 1) - 1; 58870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 58970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine default: 59070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ; 59170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 59270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 59370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Erase any embedded prototype parameters. */ 59470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( lp ) 59570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine writeblanks(lp + 1, rp); 59670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine p--; /* back up over terminator */ 59770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Find the name being declared. */ 59870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* This is complicated because of procedure and */ 59970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* array modifiers. */ 60070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for ( ; ; ) 60170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { p = skipspace(p - 1, -1); 60270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine switch ( *p ) 60370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { 60470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case ']': /* skip array dimension(s) */ 60570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case ')': /* skip procedure args OR name */ 60670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { int level = 1; 60770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine while ( level ) 60870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine switch ( *--p ) 60970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { 61070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case ']': case ')': level++; break; 61170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case '[': case '(': level--; break; 61270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case '/': p = skipspace(p, -1) + 1; break; 61370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine default: ; 61470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 61570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 61670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( *p == '(' && *skipspace(p + 1, 1) == '*' ) 61770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { /* We found the name being declared */ 61870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine while ( !isidfirstchar(*p) ) 61970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine p = skipspace(p, 1) + 1; 62070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine goto found; 62170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 62270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 62370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine default: 62470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine goto found; 62570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 62670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 62770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinefound: if ( *p == '.' && p[-1] == '.' && p[-2] == '.' ) 62870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { if ( convert_varargs ) 62970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { *bp++ = "va_alist"; 63070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine vararg = p-2; 63170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 63270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine else 63370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { p++; 63470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( bp == breaks + 1 ) /* sole argument */ 63570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine writeblanks(breaks[0], p); 63670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine else 63770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine writeblanks(bp[-1] - 1, p); 63870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine bp--; 63970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 64070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 64170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine else 64270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { while ( isidchar(*p) ) p--; 64370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *bp++ = p+1; 64470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 64570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine p = end; 64670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 64770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine while ( *p++ == ',' ); 64870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *bp = p; 64970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Make a special check for 'void' arglist */ 65070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( bp == breaks+2 ) 65170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { p = skipspace(breaks[0], 1); 65270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( !strncmp(p, "void", 4) ) 65370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { p = skipspace(p+4, 1); 65470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( p == breaks[2] - 1 ) 65570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { bp = breaks; /* yup, pretend arglist is empty */ 65670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine writeblanks(breaks[0], p + 1); 65770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 65870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 65970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 66070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Put out the function name and left parenthesis. */ 66170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine p = buf; 66270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine while ( p != endfn ) putc(*p, out), p++; 66370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Put out the declaration. */ 66470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( header ) 66570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { fputs(");", out); 66670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for ( p = breaks[0]; *p; p++ ) 66770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( *p == '\r' || *p == '\n' ) 66870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine putc(*p, out); 66970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 67070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine else 67170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { for ( ap = breaks+1; ap < bp; ap += 2 ) 67270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { p = *ap; 67370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine while ( isidchar(*p) ) 67470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine putc(*p, out), p++; 67570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( ap < bp - 1 ) 67670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fputs(", ", out); 67770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 67870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fputs(") ", out); 67970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Put out the argument declarations */ 68070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for ( ap = breaks+2; ap <= bp; ap += 2 ) 68170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*ap)[-1] = ';'; 68270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ( vararg != 0 ) 68370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { *vararg = 0; 68470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fputs(breaks[0], out); /* any prior args */ 68570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fputs("va_dcl", out); /* the final arg */ 68670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fputs(bp[0], out); 68770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 68870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine else 68970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fputs(breaks[0], out); 69070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 69170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine free((char *)breaks); 69270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return 0; 69370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 694