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