modified version of stubgen for the befpc project (first release)
This commit is contained in:
340
bepascal/bepascal/stubgen/COPYING
Normal file
340
bepascal/bepascal/stubgen/COPYING
Normal file
@@ -0,0 +1,340 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) 19yy <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) 19yy name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Library General
|
||||
Public License instead of this License.
|
||||
3
bepascal/bepascal/stubgen/Example Usage for OpenBeOS.txt
Normal file
3
bepascal/bepascal/stubgen/Example Usage for OpenBeOS.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
Example usage for OpenBeOS project:
|
||||
|
||||
stubgen -s -g -a *.h
|
||||
90
bepascal/bepascal/stubgen/Makefile
Normal file
90
bepascal/bepascal/stubgen/Makefile
Normal file
@@ -0,0 +1,90 @@
|
||||
#
|
||||
# FILE: Makefile
|
||||
# AUTH: Michael John Radwin <mjr@acm.org>
|
||||
#
|
||||
# DESC: stubgen makefile
|
||||
# modified from O'Reilly's lex & yacc, Second Edition
|
||||
#
|
||||
# DATE: Wed Aug 14 18:11:18 US/Eastern 1996
|
||||
# $Id: Makefile,v 1.1 2002-06-06 22:09:16 ocoursiere Exp $
|
||||
#
|
||||
# Copyright (c) 1996-1998 Michael John Radwin
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#
|
||||
|
||||
# --- User-definable stuff. Edit if you know what you're doing. --- #
|
||||
|
||||
# Choose your compiler. I like Sun's cc compiler because I use dbx for
|
||||
# debugging, but you might want gcc.
|
||||
CC = gcc -Wall -g
|
||||
#CC = cc
|
||||
|
||||
# You'll need to use a lexer that supports the exclusive start state
|
||||
# mechanism (the '%x' directive). GNU Flex does this just fine.
|
||||
LEX = flex
|
||||
#LEX = lex
|
||||
|
||||
# You should be able to use any of the 3 common flavors of yacc:
|
||||
# AT&T Yacc, Berkeley Yacc, or GNU Bison. We've tested with bison.
|
||||
#YACC = yacc -d
|
||||
YACC = bison -y -d
|
||||
#YACC = byacc -d
|
||||
|
||||
# etags is used purely for development purposes.
|
||||
ETAGS = etags
|
||||
|
||||
# for Sun cc, we don't like incremental linking.
|
||||
#LFLAGS = -xildoff
|
||||
|
||||
# for a lex other than GNU Flex, we must link with the -ll library.
|
||||
#LFLAGS = -ll
|
||||
|
||||
# Debug settings are on. Having the SGDEBUG macro defined will make
|
||||
# generate 'stubgen.log' files on each execution of stubgen, which are
|
||||
# useful for debugging, but probably annoying.
|
||||
CFLAGS = -g -DSGDEBUG
|
||||
#CFLAGS = -O
|
||||
|
||||
# --- You probably shouldn't edit anything below this line. --- #
|
||||
OFILES = y.tab.o lex.yy.o table.o util.o pathname.o main.o getopt.o
|
||||
SRCFILES = lexer.l parser.y table.[ch] util.[ch] pathname.[ch] main.c
|
||||
|
||||
all: stubgen
|
||||
|
||||
stubgen: $(OFILES)
|
||||
$(CC) $(CFLAGS) -o $@ $(OFILES) $(LFLAGS) $(LIBS)
|
||||
chmod 0755 $@
|
||||
|
||||
y.output: parser.y
|
||||
$(YACC) -v parser.y
|
||||
|
||||
lex.yy.c: lexer.l y.tab.h
|
||||
$(LEX) lexer.l
|
||||
|
||||
y.tab.h y.tab.c: parser.y
|
||||
$(YACC) parser.y
|
||||
|
||||
tags: TAGS
|
||||
TAGS: $(SRCFILES)
|
||||
$(ETAGS) $(SRCFILES)
|
||||
|
||||
clean:
|
||||
rm -f $(OFILES) TAGS
|
||||
rm -f y.tab.h y.tab.c lex.yy.c y.output stubgen.log
|
||||
rm -f win32/stubgen.plg win32/stubgen.ncb win32/stubgen.opt
|
||||
rm -f win32/stubgen.pdb win32/stubgen.ilk
|
||||
rm -f win32/stubgen.mak win32/stubgen.bsc win32/stubgen.log
|
||||
rm -rf win32/Debug win32/debug
|
||||
147
bepascal/bepascal/stubgen/README
Normal file
147
bepascal/bepascal/stubgen/README
Normal file
@@ -0,0 +1,147 @@
|
||||
stubgen README file
|
||||
Michael John Radwin
|
||||
$Id: README,v 1.1 2002-06-06 22:09:16 ocoursiere Exp $
|
||||
|
||||
|
||||
Description
|
||||
-----------
|
||||
Welcome to stubgen version 2.05 (build 1086).
|
||||
|
||||
stubgen is a C++ development tool that keeps code files in sync with
|
||||
their associated headers. When it finds a member function declaration
|
||||
in a header file that doesn't have a corresponding implementation, it
|
||||
creates an empty skeleton with descriptive comment headers. stubgen has
|
||||
several options, but see the "Brief Example" section below for an idea
|
||||
of what it can do.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
|
||||
Brief Example
|
||||
-------------
|
||||
Suppose you have the following header file Point.h:
|
||||
|
||||
class Point {
|
||||
public:
|
||||
Point(int x, int y);
|
||||
void addTo(const Point& other);
|
||||
|
||||
int xValue, yValue;
|
||||
};
|
||||
|
||||
Running "stubgen -s Point.h" would produce the following file:
|
||||
|
||||
/***********************************************
|
||||
* AUTHOR: Michael John Radwin <mjr@acm.org>
|
||||
* FILE: Point.cpp
|
||||
* DATE: Mon Apr 20 17:39:05 1998
|
||||
* DESCR:
|
||||
***********************************************/
|
||||
#include "Point.h"
|
||||
|
||||
/*
|
||||
* Method: Point::Point()
|
||||
* Descr:
|
||||
*/
|
||||
Point::Point(int x, int y)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* Method: Point::addTo()
|
||||
* Descr:
|
||||
*/
|
||||
void
|
||||
Point::addTo(const Point& other)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
Supported Platforms
|
||||
-------------------
|
||||
I've successfully built stubgen on the following platforms, using the
|
||||
GNU tools make, gcc, bison, and flex:
|
||||
|
||||
SPARC Solaris (2.5 and 2.6)
|
||||
SunOS 4.1.3
|
||||
SGI IRIX 5.3
|
||||
RS6000 AIX 3.2
|
||||
MS Windows NT 4.0 (using GNU bison/flex and MSVC++ 5.0)
|
||||
|
||||
|
||||
Home Page
|
||||
---------
|
||||
Check out the stubgen home page and download the current source code at:
|
||||
|
||||
http://www.radwin.org/michael/projects/stubgen/
|
||||
|
||||
|
||||
Files
|
||||
-----
|
||||
The following files are included in this distribution:
|
||||
|
||||
COPYING - the GNU general public license
|
||||
ChangeLog - a listing of changes made on various versions.
|
||||
Makefile - a makefile for building stubgen on unix
|
||||
README - this file
|
||||
etc/ - debugging routines for use with the -d option
|
||||
getopt.[ch] - GNU getopts (for Win32)
|
||||
lexer.l - flex source, generates tokens
|
||||
main.c - code generation routines
|
||||
parser.y - yacc source, parses header and code files
|
||||
pathname.[ch] - dirname() and basename() routines
|
||||
stubgen.1 - nroff-able man page
|
||||
table.[ch] - data structures used in parsing
|
||||
util.[ch] - utilities, logging routines, used in parsing
|
||||
test/ - test header files for stubgen
|
||||
win32/ - MS Visual C++ 5.0 project (Win32 console app)
|
||||
|
||||
|
||||
Building
|
||||
--------
|
||||
1. ensure that your system has 'flex' installed.
|
||||
2. ensure that your system has 'yacc', 'byacc', or 'bison' installed.
|
||||
3. edit 'Makefile' and pick your favorite CC, LEX, YACC, LFLAGS and CFLAGS
|
||||
4. run 'make'
|
||||
|
||||
We assume that flex, bison, and cc/gcc are in your path.
|
||||
|
||||
For win32, there's no need to build. You'll find stubgen.exe in the
|
||||
directory .\win32.
|
||||
|
||||
|
||||
Installing
|
||||
----------
|
||||
There is no fancy installation procedure. Since the binary doesn't
|
||||
depend on any other files, copy it to /usr/local/bin or wherever you
|
||||
choose. You may wish to copy stubgen.1 to /usr/local/man/man1 or some
|
||||
similar directory.
|
||||
|
||||
|
||||
Acknowledgments
|
||||
----------------
|
||||
stubgen borrows code from:
|
||||
|
||||
Jutta Degener's 1995 ANSI C grammar (based on Jeff Lee's 1985
|
||||
implementation):
|
||||
ftp://ftp.uu.net/usenet/net.sources/ansi.c.grammar.Z
|
||||
http://www.lysator.liu.se/c/ANSI-C-grammar-l.html
|
||||
http://www.lysator.liu.se/c/ANSI-C-grammar-y.html
|
||||
|
||||
Graham D. Parrington's Stub Generator for the Arjuna project at the
|
||||
University of Newcastle upon Tyne:
|
||||
http://arjuna.ncl.ac.uk/
|
||||
|
||||
|
||||
Copyright
|
||||
---------
|
||||
stubgen is Copyright (c) 1996-1998 Michael John Radwin, under the terms
|
||||
of the GNU General Public License. See COPYING for more.
|
||||
826
bepascal/bepascal/stubgen/getopt.c
Normal file
826
bepascal/bepascal/stubgen/getopt.c
Normal file
@@ -0,0 +1,826 @@
|
||||
/* Getopt for GNU.
|
||||
NOTE: getopt is now part of the C library, so if you don't know what
|
||||
"Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu
|
||||
before changing it!
|
||||
|
||||
Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 1996
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
USA. */
|
||||
|
||||
/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
|
||||
Ditto for AIX 3.2 and <stdlib.h>. */
|
||||
#ifndef _NO_PROTO
|
||||
#define _NO_PROTO
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#if !defined (__STDC__) || !__STDC__
|
||||
/* This is a separate conditional since some stdc systems
|
||||
reject `defined (const)'. */
|
||||
#ifndef const
|
||||
#define const
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/* Comment out all this code if we are using the GNU C Library, and are not
|
||||
actually compiling the library itself. This code is part of the GNU C
|
||||
Library, but also included in many other GNU distributions. Compiling
|
||||
and linking in this code is a waste when using the GNU C library
|
||||
(especially if it is a shared library). Rather than having every GNU
|
||||
program understand `configure --with-gnu-libc' and omit the object files,
|
||||
it is simpler to just do this in the source for each such file. */
|
||||
|
||||
#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
|
||||
|
||||
|
||||
/* This needs to come after some library #include
|
||||
to get __GNU_LIBRARY__ defined. */
|
||||
#ifdef __GNU_LIBRARY__
|
||||
/* Don't include stdlib.h for non-GNU C libraries because some of them
|
||||
contain conflicting prototypes for getopt. */
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#endif /* GNU C library. */
|
||||
|
||||
#ifdef VMS
|
||||
#include <unixlib.h>
|
||||
#if HAVE_STRING_H - 0
|
||||
#include <string.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined (WIN32) && !defined (__CYGWIN32__)
|
||||
/* It's not Unix, really. See? Capital letters. */
|
||||
#include <windows.h>
|
||||
#define getpid() GetCurrentProcessId()
|
||||
#endif
|
||||
|
||||
#ifndef _
|
||||
/* This is for other GNU distributions with internationalized messages.
|
||||
When compiling libc, the _ macro is predefined. */
|
||||
#ifdef HAVE_LIBINTL_H
|
||||
# include <libintl.h>
|
||||
# define _(msgid) gettext (msgid)
|
||||
#else
|
||||
# define _(msgid) (msgid)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* This version of `getopt' appears to the caller like standard Unix `getopt'
|
||||
but it behaves differently for the user, since it allows the user
|
||||
to intersperse the options with the other arguments.
|
||||
|
||||
As `getopt' works, it permutes the elements of ARGV so that,
|
||||
when it is done, all the options precede everything else. Thus
|
||||
all application programs are extended to handle flexible argument order.
|
||||
|
||||
Setting the environment variable POSIXLY_CORRECT disables permutation.
|
||||
Then the behavior is completely standard.
|
||||
|
||||
GNU application programs can use a third alternative mode in which
|
||||
they can distinguish the relative order of options and other arguments. */
|
||||
|
||||
#include "getopt.h"
|
||||
|
||||
/* For communication from `getopt' to the caller.
|
||||
When `getopt' finds an option that takes an argument,
|
||||
the argument value is returned here.
|
||||
Also, when `ordering' is RETURN_IN_ORDER,
|
||||
each non-option ARGV-element is returned here. */
|
||||
|
||||
char *optarg = NULL;
|
||||
|
||||
/* Index in ARGV of the next element to be scanned.
|
||||
This is used for communication to and from the caller
|
||||
and for communication between successive calls to `getopt'.
|
||||
|
||||
On entry to `getopt', zero means this is the first call; initialize.
|
||||
|
||||
When `getopt' returns EOF, this is the index of the first of the
|
||||
non-option elements that the caller should itself scan.
|
||||
|
||||
Otherwise, `optind' communicates from one call to the next
|
||||
how much of ARGV has been scanned so far. */
|
||||
|
||||
/* XXX 1003.2 says this must be 1 before any call. */
|
||||
int optind = 0;
|
||||
|
||||
/* The next char to be scanned in the option-element
|
||||
in which the last option character we returned was found.
|
||||
This allows us to pick up the scan where we left off.
|
||||
|
||||
If this is zero, or a null string, it means resume the scan
|
||||
by advancing to the next ARGV-element. */
|
||||
|
||||
static char *nextchar;
|
||||
|
||||
/* Callers store zero here to inhibit the error message
|
||||
for unrecognized options. */
|
||||
|
||||
int opterr = 1;
|
||||
|
||||
/* Set to an option character which was unrecognized.
|
||||
This must be initialized on some systems to avoid linking in the
|
||||
system's own getopt implementation. */
|
||||
|
||||
int optopt = '?';
|
||||
|
||||
/* Describe how to deal with options that follow non-option ARGV-elements.
|
||||
|
||||
If the caller did not specify anything,
|
||||
the default is REQUIRE_ORDER if the environment variable
|
||||
POSIXLY_CORRECT is defined, PERMUTE otherwise.
|
||||
|
||||
REQUIRE_ORDER means don't recognize them as options;
|
||||
stop option processing when the first non-option is seen.
|
||||
This is what Unix does.
|
||||
This mode of operation is selected by either setting the environment
|
||||
variable POSIXLY_CORRECT, or using `+' as the first character
|
||||
of the list of option characters.
|
||||
|
||||
PERMUTE is the default. We permute the contents of ARGV as we scan,
|
||||
so that eventually all the non-options are at the end. This allows options
|
||||
to be given in any order, even with programs that were not written to
|
||||
expect this.
|
||||
|
||||
RETURN_IN_ORDER is an option available to programs that were written
|
||||
to expect options and other ARGV-elements in any order and that care about
|
||||
the ordering of the two. We describe each non-option ARGV-element
|
||||
as if it were the argument of an option with character code 1.
|
||||
Using `-' as the first character of the list of option characters
|
||||
selects this mode of operation.
|
||||
|
||||
The special argument `--' forces an end of option-scanning regardless
|
||||
of the value of `ordering'. In the case of RETURN_IN_ORDER, only
|
||||
`--' can cause `getopt' to return EOF with `optind' != ARGC. */
|
||||
|
||||
static enum
|
||||
{
|
||||
REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
|
||||
} ordering;
|
||||
|
||||
/* Value of POSIXLY_CORRECT environment variable. */
|
||||
static char *posixly_correct;
|
||||
|
||||
#ifdef __GNU_LIBRARY__
|
||||
/* We want to avoid inclusion of string.h with non-GNU libraries
|
||||
because there are many ways it can cause trouble.
|
||||
On some systems, it contains special magic macros that don't work
|
||||
in GCC. */
|
||||
#include <string.h>
|
||||
#define my_index strchr
|
||||
#else
|
||||
|
||||
/* Avoid depending on library functions or files
|
||||
whose names are inconsistent. */
|
||||
|
||||
char *getenv ();
|
||||
|
||||
static char *
|
||||
my_index (str, chr)
|
||||
const char *str;
|
||||
int chr;
|
||||
{
|
||||
while (*str)
|
||||
{
|
||||
if (*str == chr)
|
||||
return (char *) str;
|
||||
str++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* If using GCC, we can safely declare strlen this way.
|
||||
If not using GCC, it is ok not to declare it. */
|
||||
#ifdef __GNUC__
|
||||
/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h.
|
||||
That was relevant to code that was here before. */
|
||||
#if !defined (__STDC__) || !__STDC__
|
||||
/* gcc with -traditional declares the built-in strlen to return int,
|
||||
and has done so at least since version 2.4.5. -- rms. */
|
||||
extern int strlen (const char *);
|
||||
#endif /* not __STDC__ */
|
||||
#endif /* __GNUC__ */
|
||||
|
||||
#endif /* not __GNU_LIBRARY__ */
|
||||
|
||||
/* Handle permutation of arguments. */
|
||||
|
||||
/* Describe the part of ARGV that contains non-options that have
|
||||
been skipped. `first_nonopt' is the index in ARGV of the first of them;
|
||||
`last_nonopt' is the index after the last of them. */
|
||||
|
||||
static int first_nonopt;
|
||||
static int last_nonopt;
|
||||
|
||||
/* Bash 2.0 gives us an environment variable containing flags
|
||||
indicating ARGV elements that should not be considered arguments. */
|
||||
|
||||
static const char *nonoption_flags;
|
||||
static int nonoption_flags_len;
|
||||
|
||||
/* Exchange two adjacent subsequences of ARGV.
|
||||
One subsequence is elements [first_nonopt,last_nonopt)
|
||||
which contains all the non-options that have been skipped so far.
|
||||
The other is elements [last_nonopt,optind), which contains all
|
||||
the options processed since those non-options were skipped.
|
||||
|
||||
`first_nonopt' and `last_nonopt' are relocated so that they describe
|
||||
the new indices of the non-options in ARGV after they are moved. */
|
||||
|
||||
#if defined (__STDC__) && __STDC__
|
||||
static void exchange (char **);
|
||||
#endif
|
||||
|
||||
static void
|
||||
exchange (argv)
|
||||
char **argv;
|
||||
{
|
||||
int bottom = first_nonopt;
|
||||
int middle = last_nonopt;
|
||||
int top = optind;
|
||||
char *tem;
|
||||
|
||||
/* Exchange the shorter segment with the far end of the longer segment.
|
||||
That puts the shorter segment into the right place.
|
||||
It leaves the longer segment in the right place overall,
|
||||
but it consists of two parts that need to be swapped next. */
|
||||
|
||||
while (top > middle && middle > bottom)
|
||||
{
|
||||
if (top - middle > middle - bottom)
|
||||
{
|
||||
/* Bottom segment is the short one. */
|
||||
int len = middle - bottom;
|
||||
register int i;
|
||||
|
||||
/* Swap it with the top part of the top segment. */
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
tem = argv[bottom + i];
|
||||
argv[bottom + i] = argv[top - (middle - bottom) + i];
|
||||
argv[top - (middle - bottom) + i] = tem;
|
||||
}
|
||||
/* Exclude the moved bottom segment from further swapping. */
|
||||
top -= len;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Top segment is the short one. */
|
||||
int len = top - middle;
|
||||
register int i;
|
||||
|
||||
/* Swap it with the bottom part of the bottom segment. */
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
tem = argv[bottom + i];
|
||||
argv[bottom + i] = argv[middle + i];
|
||||
argv[middle + i] = tem;
|
||||
}
|
||||
/* Exclude the moved top segment from further swapping. */
|
||||
bottom += len;
|
||||
}
|
||||
}
|
||||
|
||||
/* Update records for the slots the non-options now occupy. */
|
||||
|
||||
first_nonopt += (optind - last_nonopt);
|
||||
last_nonopt = optind;
|
||||
}
|
||||
|
||||
/* Initialize the internal data when the first call is made. */
|
||||
|
||||
#if defined (__STDC__) && __STDC__
|
||||
static const char *_getopt_initialize (const char *);
|
||||
#endif
|
||||
static const char *
|
||||
_getopt_initialize (optstring)
|
||||
const char *optstring;
|
||||
{
|
||||
/* Start processing options with ARGV-element 1 (since ARGV-element 0
|
||||
is the program name); the sequence of previously skipped
|
||||
non-option ARGV-elements is empty. */
|
||||
|
||||
first_nonopt = last_nonopt = optind = 1;
|
||||
|
||||
nextchar = NULL;
|
||||
|
||||
posixly_correct = getenv ("POSIXLY_CORRECT");
|
||||
|
||||
/* Determine how to handle the ordering of options and nonoptions. */
|
||||
|
||||
if (optstring[0] == '-')
|
||||
{
|
||||
ordering = RETURN_IN_ORDER;
|
||||
++optstring;
|
||||
}
|
||||
else if (optstring[0] == '+')
|
||||
{
|
||||
ordering = REQUIRE_ORDER;
|
||||
++optstring;
|
||||
}
|
||||
else if (posixly_correct != NULL)
|
||||
ordering = REQUIRE_ORDER;
|
||||
else
|
||||
ordering = PERMUTE;
|
||||
|
||||
if (posixly_correct == NULL)
|
||||
{
|
||||
/* Bash 2.0 puts a special variable in the environment for each
|
||||
command it runs, specifying which ARGV elements are the results of
|
||||
file name wildcard expansion and therefore should not be
|
||||
considered as options. */
|
||||
char var[100];
|
||||
sprintf (var, "_%d_GNU_nonoption_argv_flags_", getpid ());
|
||||
nonoption_flags = getenv (var);
|
||||
if (nonoption_flags == NULL)
|
||||
nonoption_flags_len = 0;
|
||||
else
|
||||
nonoption_flags_len = strlen (nonoption_flags);
|
||||
}
|
||||
|
||||
return optstring;
|
||||
}
|
||||
|
||||
/* Scan elements of ARGV (whose length is ARGC) for option characters
|
||||
given in OPTSTRING.
|
||||
|
||||
If an element of ARGV starts with '-', and is not exactly "-" or "--",
|
||||
then it is an option element. The characters of this element
|
||||
(aside from the initial '-') are option characters. If `getopt'
|
||||
is called repeatedly, it returns successively each of the option characters
|
||||
from each of the option elements.
|
||||
|
||||
If `getopt' finds another option character, it returns that character,
|
||||
updating `optind' and `nextchar' so that the next call to `getopt' can
|
||||
resume the scan with the following option character or ARGV-element.
|
||||
|
||||
If there are no more option characters, `getopt' returns `EOF'.
|
||||
Then `optind' is the index in ARGV of the first ARGV-element
|
||||
that is not an option. (The ARGV-elements have been permuted
|
||||
so that those that are not options now come last.)
|
||||
|
||||
OPTSTRING is a string containing the legitimate option characters.
|
||||
If an option character is seen that is not listed in OPTSTRING,
|
||||
return '?' after printing an error message. If you set `opterr' to
|
||||
zero, the error message is suppressed but we still return '?'.
|
||||
|
||||
If a char in OPTSTRING is followed by a colon, that means it wants an arg,
|
||||
so the following text in the same ARGV-element, or the text of the following
|
||||
ARGV-element, is returned in `optarg'. Two colons mean an option that
|
||||
wants an optional arg; if there is text in the current ARGV-element,
|
||||
it is returned in `optarg', otherwise `optarg' is set to zero.
|
||||
|
||||
If OPTSTRING starts with `-' or `+', it requests different methods of
|
||||
handling the non-option ARGV-elements.
|
||||
See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
|
||||
|
||||
Long-named options begin with `--' instead of `-'.
|
||||
Their names may be abbreviated as long as the abbreviation is unique
|
||||
or is an exact match for some defined option. If they have an
|
||||
argument, it follows the option name in the same ARGV-element, separated
|
||||
from the option name by a `=', or else the in next ARGV-element.
|
||||
When `getopt' finds a long-named option, it returns 0 if that option's
|
||||
`flag' field is nonzero, the value of the option's `val' field
|
||||
if the `flag' field is zero.
|
||||
|
||||
The elements of ARGV aren't really const, because we permute them.
|
||||
But we pretend they're const in the prototype to be compatible
|
||||
with other systems.
|
||||
|
||||
LONGOPTS is a vector of `struct option' terminated by an
|
||||
element containing a name which is zero.
|
||||
|
||||
LONGIND returns the index in LONGOPT of the long-named option found.
|
||||
It is only valid when a long-named option has been found by the most
|
||||
recent call.
|
||||
|
||||
If LONG_ONLY is nonzero, '-' as well as '--' can introduce
|
||||
long-named options. */
|
||||
|
||||
int
|
||||
_getopt_internal (argc, argv, optstring, longopts, longind, long_only)
|
||||
int argc;
|
||||
char *const *argv;
|
||||
const char *optstring;
|
||||
const struct option *longopts;
|
||||
int *longind;
|
||||
int long_only;
|
||||
{
|
||||
optarg = NULL;
|
||||
|
||||
if (optind == 0)
|
||||
{
|
||||
optstring = _getopt_initialize (optstring);
|
||||
optind = 1; /* Don't scan ARGV[0], the program name. */
|
||||
}
|
||||
|
||||
/* Test whether ARGV[optind] points to a non-option argument.
|
||||
Either it does not have option syntax, or there is an environment flag
|
||||
from the shell indicating it is not an option. */
|
||||
#define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \
|
||||
|| (optind < nonoption_flags_len \
|
||||
&& nonoption_flags[optind] == '1'))
|
||||
|
||||
if (nextchar == NULL || *nextchar == '\0')
|
||||
{
|
||||
/* Advance to the next ARGV-element. */
|
||||
|
||||
/* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
|
||||
moved back by the user (who may also have changed the arguments). */
|
||||
if (last_nonopt > optind)
|
||||
last_nonopt = optind;
|
||||
if (first_nonopt > optind)
|
||||
first_nonopt = optind;
|
||||
|
||||
if (ordering == PERMUTE)
|
||||
{
|
||||
/* If we have just processed some options following some non-options,
|
||||
exchange them so that the options come first. */
|
||||
|
||||
if (first_nonopt != last_nonopt && last_nonopt != optind)
|
||||
exchange ((char **) argv);
|
||||
else if (last_nonopt != optind)
|
||||
first_nonopt = optind;
|
||||
|
||||
/* Skip any additional non-options
|
||||
and extend the range of non-options previously skipped. */
|
||||
|
||||
while (optind < argc && NONOPTION_P)
|
||||
optind++;
|
||||
last_nonopt = optind;
|
||||
}
|
||||
|
||||
/* The special ARGV-element `--' means premature end of options.
|
||||
Skip it like a null option,
|
||||
then exchange with previous non-options as if it were an option,
|
||||
then skip everything else like a non-option. */
|
||||
|
||||
if (optind != argc && !strcmp (argv[optind], "--"))
|
||||
{
|
||||
optind++;
|
||||
|
||||
if (first_nonopt != last_nonopt && last_nonopt != optind)
|
||||
exchange ((char **) argv);
|
||||
else if (first_nonopt == last_nonopt)
|
||||
first_nonopt = optind;
|
||||
last_nonopt = argc;
|
||||
|
||||
optind = argc;
|
||||
}
|
||||
|
||||
/* If we have done all the ARGV-elements, stop the scan
|
||||
and back over any non-options that we skipped and permuted. */
|
||||
|
||||
if (optind == argc)
|
||||
{
|
||||
/* Set the next-arg-index to point at the non-options
|
||||
that we previously skipped, so the caller will digest them. */
|
||||
if (first_nonopt != last_nonopt)
|
||||
optind = first_nonopt;
|
||||
return EOF;
|
||||
}
|
||||
|
||||
/* If we have come to a non-option and did not permute it,
|
||||
either stop the scan or describe it to the caller and pass it by. */
|
||||
|
||||
if (NONOPTION_P)
|
||||
{
|
||||
if (ordering == REQUIRE_ORDER)
|
||||
return EOF;
|
||||
optarg = argv[optind++];
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* We have found another option-ARGV-element.
|
||||
Skip the initial punctuation. */
|
||||
|
||||
nextchar = (argv[optind] + 1
|
||||
+ (longopts != NULL && argv[optind][1] == '-'));
|
||||
}
|
||||
|
||||
/* Decode the current option-ARGV-element. */
|
||||
|
||||
/* Check whether the ARGV-element is a long option.
|
||||
|
||||
If long_only and the ARGV-element has the form "-f", where f is
|
||||
a valid short option, don't consider it an abbreviated form of
|
||||
a long option that starts with f. Otherwise there would be no
|
||||
way to give the -f short option.
|
||||
|
||||
On the other hand, if there's a long option "fubar" and
|
||||
the ARGV-element is "-fu", do consider that an abbreviation of
|
||||
the long option, just like "--fu", and not "-f" with arg "u".
|
||||
|
||||
This distinction seems to be the most useful approach. */
|
||||
|
||||
if (longopts != NULL
|
||||
&& (argv[optind][1] == '-'
|
||||
|| (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1])))))
|
||||
{
|
||||
char *nameend;
|
||||
const struct option *p;
|
||||
const struct option *pfound = NULL;
|
||||
int exact = 0;
|
||||
int ambig = 0;
|
||||
int indfound;
|
||||
int option_index;
|
||||
|
||||
for (nameend = nextchar; *nameend && *nameend != '='; nameend++)
|
||||
/* Do nothing. */ ;
|
||||
|
||||
/* Test all long options for either exact match
|
||||
or abbreviated matches. */
|
||||
for (p = longopts, option_index = 0; p->name; p++, option_index++)
|
||||
if (!strncmp (p->name, nextchar, nameend - nextchar))
|
||||
{
|
||||
if (nameend - nextchar == strlen (p->name))
|
||||
{
|
||||
/* Exact match found. */
|
||||
pfound = p;
|
||||
indfound = option_index;
|
||||
exact = 1;
|
||||
break;
|
||||
}
|
||||
else if (pfound == NULL)
|
||||
{
|
||||
/* First nonexact match found. */
|
||||
pfound = p;
|
||||
indfound = option_index;
|
||||
}
|
||||
else
|
||||
/* Second or later nonexact match found. */
|
||||
ambig = 1;
|
||||
}
|
||||
|
||||
if (ambig && !exact)
|
||||
{
|
||||
if (opterr)
|
||||
fprintf (stderr, _("%s: option `%s' is ambiguous\n"),
|
||||
argv[0], argv[optind]);
|
||||
nextchar += strlen (nextchar);
|
||||
optind++;
|
||||
optopt = 0;
|
||||
return '?';
|
||||
}
|
||||
|
||||
if (pfound != NULL)
|
||||
{
|
||||
option_index = indfound;
|
||||
optind++;
|
||||
if (*nameend)
|
||||
{
|
||||
/* Don't test has_arg with >, because some C compilers don't
|
||||
allow it to be used on enums. */
|
||||
if (pfound->has_arg)
|
||||
optarg = nameend + 1;
|
||||
else
|
||||
{
|
||||
if (opterr)
|
||||
if (argv[optind - 1][1] == '-')
|
||||
/* --option */
|
||||
fprintf (stderr,
|
||||
_("%s: option `--%s' doesn't allow an argument\n"),
|
||||
argv[0], pfound->name);
|
||||
else
|
||||
/* +option or -option */
|
||||
fprintf (stderr,
|
||||
_("%s: option `%c%s' doesn't allow an argument\n"),
|
||||
argv[0], argv[optind - 1][0], pfound->name);
|
||||
|
||||
nextchar += strlen (nextchar);
|
||||
|
||||
optopt = pfound->val;
|
||||
return '?';
|
||||
}
|
||||
}
|
||||
else if (pfound->has_arg == 1)
|
||||
{
|
||||
if (optind < argc)
|
||||
optarg = argv[optind++];
|
||||
else
|
||||
{
|
||||
if (opterr)
|
||||
fprintf (stderr,
|
||||
_("%s: option `%s' requires an argument\n"),
|
||||
argv[0], argv[optind - 1]);
|
||||
nextchar += strlen (nextchar);
|
||||
optopt = pfound->val;
|
||||
return optstring[0] == ':' ? ':' : '?';
|
||||
}
|
||||
}
|
||||
nextchar += strlen (nextchar);
|
||||
if (longind != NULL)
|
||||
*longind = option_index;
|
||||
if (pfound->flag)
|
||||
{
|
||||
*(pfound->flag) = pfound->val;
|
||||
return 0;
|
||||
}
|
||||
return pfound->val;
|
||||
}
|
||||
|
||||
/* Can't find it as a long option. If this is not getopt_long_only,
|
||||
or the option starts with '--' or is not a valid short
|
||||
option, then it's an error.
|
||||
Otherwise interpret it as a short option. */
|
||||
if (!long_only || argv[optind][1] == '-'
|
||||
|| my_index (optstring, *nextchar) == NULL)
|
||||
{
|
||||
if (opterr)
|
||||
{
|
||||
if (argv[optind][1] == '-')
|
||||
/* --option */
|
||||
fprintf (stderr, _("%s: unrecognized option `--%s'\n"),
|
||||
argv[0], nextchar);
|
||||
else
|
||||
/* +option or -option */
|
||||
fprintf (stderr, _("%s: unrecognized option `%c%s'\n"),
|
||||
argv[0], argv[optind][0], nextchar);
|
||||
}
|
||||
nextchar = (char *) "";
|
||||
optind++;
|
||||
optopt = 0;
|
||||
return '?';
|
||||
}
|
||||
}
|
||||
|
||||
/* Look at and handle the next short option-character. */
|
||||
|
||||
{
|
||||
char c = *nextchar++;
|
||||
char *temp = my_index (optstring, c);
|
||||
|
||||
/* Increment `optind' when we start to process its last character. */
|
||||
if (*nextchar == '\0')
|
||||
++optind;
|
||||
|
||||
if (temp == NULL || c == ':')
|
||||
{
|
||||
if (opterr)
|
||||
{
|
||||
if (posixly_correct)
|
||||
/* 1003.2 specifies the format of this message. */
|
||||
fprintf (stderr, _("%s: illegal option -- %c\n"),
|
||||
argv[0], c);
|
||||
else
|
||||
fprintf (stderr, _("%s: invalid option -- %c\n"),
|
||||
argv[0], c);
|
||||
}
|
||||
optopt = c;
|
||||
return '?';
|
||||
}
|
||||
if (temp[1] == ':')
|
||||
{
|
||||
if (temp[2] == ':')
|
||||
{
|
||||
/* This is an option that accepts an argument optionally. */
|
||||
if (*nextchar != '\0')
|
||||
{
|
||||
optarg = nextchar;
|
||||
optind++;
|
||||
}
|
||||
else
|
||||
optarg = NULL;
|
||||
nextchar = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* This is an option that requires an argument. */
|
||||
if (*nextchar != '\0')
|
||||
{
|
||||
optarg = nextchar;
|
||||
/* If we end this ARGV-element by taking the rest as an arg,
|
||||
we must advance to the next element now. */
|
||||
optind++;
|
||||
}
|
||||
else if (optind == argc)
|
||||
{
|
||||
if (opterr)
|
||||
{
|
||||
/* 1003.2 specifies the format of this message. */
|
||||
fprintf (stderr,
|
||||
_("%s: option requires an argument -- %c\n"),
|
||||
argv[0], c);
|
||||
}
|
||||
optopt = c;
|
||||
if (optstring[0] == ':')
|
||||
c = ':';
|
||||
else
|
||||
c = '?';
|
||||
}
|
||||
else
|
||||
/* We already incremented `optind' once;
|
||||
increment it again when taking next ARGV-elt as argument. */
|
||||
optarg = argv[optind++];
|
||||
nextchar = NULL;
|
||||
}
|
||||
}
|
||||
return c;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
getopt (argc, argv, optstring)
|
||||
int argc;
|
||||
char *const *argv;
|
||||
const char *optstring;
|
||||
{
|
||||
return _getopt_internal (argc, argv, optstring,
|
||||
(const struct option *) 0,
|
||||
(int *) 0,
|
||||
0);
|
||||
}
|
||||
|
||||
#endif /* _LIBC or not __GNU_LIBRARY__. */
|
||||
|
||||
#ifdef TEST
|
||||
|
||||
/* Compile with -DTEST to make an executable for use in testing
|
||||
the above definition of `getopt'. */
|
||||
|
||||
int
|
||||
main (argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
{
|
||||
int c;
|
||||
int digit_optind = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
int this_option_optind = optind ? optind : 1;
|
||||
|
||||
c = getopt (argc, argv, "abc:d:0123456789");
|
||||
if (c == EOF)
|
||||
break;
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case '0':
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
case '8':
|
||||
case '9':
|
||||
if (digit_optind != 0 && digit_optind != this_option_optind)
|
||||
printf ("digits occur in two different argv-elements.\n");
|
||||
digit_optind = this_option_optind;
|
||||
printf ("option %c\n", c);
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
printf ("option a\n");
|
||||
break;
|
||||
|
||||
case 'b':
|
||||
printf ("option b\n");
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
printf ("option c with value `%s'\n", optarg);
|
||||
break;
|
||||
|
||||
case '?':
|
||||
break;
|
||||
|
||||
default:
|
||||
printf ("?? getopt returned character code 0%o ??\n", c);
|
||||
}
|
||||
}
|
||||
|
||||
if (optind < argc)
|
||||
{
|
||||
printf ("non-option ARGV-elements: ");
|
||||
while (optind < argc)
|
||||
printf ("%s ", argv[optind++]);
|
||||
printf ("\n");
|
||||
}
|
||||
|
||||
exit (0);
|
||||
}
|
||||
|
||||
#endif /* TEST */
|
||||
130
bepascal/bepascal/stubgen/getopt.h
Normal file
130
bepascal/bepascal/stubgen/getopt.h
Normal file
@@ -0,0 +1,130 @@
|
||||
/* Declarations for getopt.
|
||||
Copyright (C) 1989, 90, 91, 92, 93, 94 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
USA. */
|
||||
|
||||
#ifndef _GETOPT_H
|
||||
#define _GETOPT_H 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* For communication from `getopt' to the caller.
|
||||
When `getopt' finds an option that takes an argument,
|
||||
the argument value is returned here.
|
||||
Also, when `ordering' is RETURN_IN_ORDER,
|
||||
each non-option ARGV-element is returned here. */
|
||||
|
||||
extern char *optarg;
|
||||
|
||||
/* Index in ARGV of the next element to be scanned.
|
||||
This is used for communication to and from the caller
|
||||
and for communication between successive calls to `getopt'.
|
||||
|
||||
On entry to `getopt', zero means this is the first call; initialize.
|
||||
|
||||
When `getopt' returns EOF, this is the index of the first of the
|
||||
non-option elements that the caller should itself scan.
|
||||
|
||||
Otherwise, `optind' communicates from one call to the next
|
||||
how much of ARGV has been scanned so far. */
|
||||
|
||||
extern int optind;
|
||||
|
||||
/* Callers store zero here to inhibit the error message `getopt' prints
|
||||
for unrecognized options. */
|
||||
|
||||
extern int opterr;
|
||||
|
||||
/* Set to an option character which was unrecognized. */
|
||||
|
||||
extern int optopt;
|
||||
|
||||
/* Describe the long-named options requested by the application.
|
||||
The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
|
||||
of `struct option' terminated by an element containing a name which is
|
||||
zero.
|
||||
|
||||
The field `has_arg' is:
|
||||
no_argument (or 0) if the option does not take an argument,
|
||||
required_argument (or 1) if the option requires an argument,
|
||||
optional_argument (or 2) if the option takes an optional argument.
|
||||
|
||||
If the field `flag' is not NULL, it points to a variable that is set
|
||||
to the value given in the field `val' when the option is found, but
|
||||
left unchanged if the option is not found.
|
||||
|
||||
To have a long-named option do something other than set an `int' to
|
||||
a compiled-in constant, such as set a value from `optarg', set the
|
||||
option's `flag' field to zero and its `val' field to a nonzero
|
||||
value (the equivalent single-letter option character, if there is
|
||||
one). For long options that have a zero `flag' field, `getopt'
|
||||
returns the contents of the `val' field. */
|
||||
|
||||
struct option
|
||||
{
|
||||
#if defined (__STDC__) && __STDC__
|
||||
const char *name;
|
||||
#else
|
||||
char *name;
|
||||
#endif
|
||||
/* has_arg can't be an enum because some compilers complain about
|
||||
type mismatches in all the code that assumes it is an int. */
|
||||
int has_arg;
|
||||
int *flag;
|
||||
int val;
|
||||
};
|
||||
|
||||
/* Names for the values of the `has_arg' field of `struct option'. */
|
||||
|
||||
#define no_argument 0
|
||||
#define required_argument 1
|
||||
#define optional_argument 2
|
||||
|
||||
#if defined (__STDC__) && __STDC__
|
||||
#ifdef __GNU_LIBRARY__
|
||||
/* Many other libraries have conflicting prototypes for getopt, with
|
||||
differences in the consts, in stdlib.h. To avoid compilation
|
||||
errors, only prototype getopt for the GNU C library. */
|
||||
extern int getopt (int argc, char *const *argv, const char *shortopts);
|
||||
#else /* not __GNU_LIBRARY__ */
|
||||
extern int getopt ();
|
||||
#endif /* __GNU_LIBRARY__ */
|
||||
extern int getopt_long (int argc, char *const *argv, const char *shortopts,
|
||||
const struct option *longopts, int *longind);
|
||||
extern int getopt_long_only (int argc, char *const *argv,
|
||||
const char *shortopts,
|
||||
const struct option *longopts, int *longind);
|
||||
|
||||
/* Internal only. Users should not call this directly. */
|
||||
extern int _getopt_internal (int argc, char *const *argv,
|
||||
const char *shortopts,
|
||||
const struct option *longopts, int *longind,
|
||||
int long_only);
|
||||
#else /* not __STDC__ */
|
||||
extern int getopt ();
|
||||
extern int getopt_long ();
|
||||
extern int getopt_long_only ();
|
||||
|
||||
extern int _getopt_internal ();
|
||||
#endif /* __STDC__ */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _GETOPT_H */
|
||||
2652
bepascal/bepascal/stubgen/lex.yy.c
Normal file
2652
bepascal/bepascal/stubgen/lex.yy.c
Normal file
File diff suppressed because it is too large
Load Diff
522
bepascal/bepascal/stubgen/lexer.l
Normal file
522
bepascal/bepascal/stubgen/lexer.l
Normal file
@@ -0,0 +1,522 @@
|
||||
%{
|
||||
/*
|
||||
* FILE: lexer.l
|
||||
* AUTH: Michael John Radwin <mjr@acm.org>
|
||||
*
|
||||
* DESC: stubgen lexer. Portions borrowed from Newcastle
|
||||
* University's Arjuna project (http://arjuna.ncl.ac.uk/), and
|
||||
* Jeff Lee's ANSI Grammar
|
||||
* (ftp://ftp.uu.net/usenet/net.sources/ansi.c.grammar.Z)
|
||||
*
|
||||
* DATE: Thu Aug 15 13:10:06 EDT 1996
|
||||
* $Id: lexer.l,v 1.1 2002-06-06 22:09:16 ocoursiere Exp $
|
||||
*
|
||||
* Copyright (c) 1996-1998 Michael John Radwin
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Modification history:
|
||||
* $Log: not supported by cvs2svn $
|
||||
* Revision 1.1 2001/11/07 10:06:07 ithamar
|
||||
* Added stubgen to CVS
|
||||
*
|
||||
* Revision 1.33 1998/07/27 19:16:57 mradwin
|
||||
* added some c++ keywords
|
||||
* need to handle typename, using, and namespace
|
||||
*
|
||||
* Revision 1.32 1998/05/11 19:49:11 mradwin
|
||||
* Version 2.03 (updated copyright information).
|
||||
*
|
||||
* Revision 1.31 1998/04/07 23:39:55 mradwin
|
||||
* changed error-handling code significantly. functions
|
||||
* like count() are now contributing to linebuf so we get correct
|
||||
* parse error messages during lineno == 1 and other situations.
|
||||
* also, instead of calling fatal() for collect*() functions,
|
||||
* we return -1 and let the parser recover more gracefully.
|
||||
*
|
||||
* Revision 1.30 1998/01/12 19:39:11 mradwin
|
||||
* modified rcsid
|
||||
*
|
||||
* Revision 1.29 1997/11/13 22:37:31 mradwin
|
||||
* changed char[] to char * to make non-gcc compilers
|
||||
* a little happier. We need to #define const to nothing
|
||||
* for other compilers as well.
|
||||
*
|
||||
* Revision 1.28 1997/11/13 21:29:30 mradwin
|
||||
* moved code from parser.y to main.c
|
||||
*
|
||||
* Revision 1.27 1997/11/13 21:10:17 mradwin
|
||||
* renamed stubgen.[ly] to parser.y lexer.l
|
||||
*
|
||||
* Revision 1.26 1997/11/11 03:52:06 mradwin
|
||||
* changed fatal()
|
||||
*
|
||||
* Revision 1.25 1997/11/05 03:02:02 mradwin
|
||||
* Modified logging routines.
|
||||
*
|
||||
* Revision 1.24 1997/11/01 23:12:43 mradwin
|
||||
* greatly improved error-recovery. errors no longer spill over
|
||||
* into other files because the yyerror state is properly reset.
|
||||
*
|
||||
* Revision 1.23 1997/10/26 23:16:32 mradwin
|
||||
* changed inform_user and fatal functions to use varargs
|
||||
*
|
||||
* Revision 1.22 1997/10/26 22:46:48 mradwin
|
||||
* support macros within comments, etc.
|
||||
*
|
||||
* Revision 1.21 1997/10/16 19:42:48 mradwin
|
||||
* added support for elipses, static member/array initializers,
|
||||
* and bitfields.
|
||||
*
|
||||
* Revision 1.20 1997/10/16 17:36:06 mradwin
|
||||
* Fixed compiler warning on win32 from <ctype.h> and isspace()
|
||||
*
|
||||
* Revision 1.19 1997/10/16 17:12:59 mradwin
|
||||
* handle extern "C" blocks better now, and support multi-line
|
||||
* macros. still need error-checking.
|
||||
*
|
||||
* Revision 1.18 1997/10/15 22:09:06 mradwin
|
||||
* changed tons of names. stubelem -> sytaxelem,
|
||||
* stubin -> infile, stubout -> outfile, stublog -> logfile.
|
||||
*
|
||||
* Revision 1.17 1997/10/15 21:45:13 mradwin
|
||||
* rearranged table.[ch] and util.[ch] so that util pkg
|
||||
* knows nothing about syntaxelems.
|
||||
*
|
||||
* Revision 1.16 1997/10/15 17:42:37 mradwin
|
||||
* added support for 'extern "C" { ... }' blocks.
|
||||
*
|
||||
* Revision 1.15 1997/09/05 19:17:06 mradwin
|
||||
* works for scanning old versions, except for parameter
|
||||
* names that differ between .H and .C files.
|
||||
*
|
||||
* Revision 1.14 1997/09/05 16:37:41 mradwin
|
||||
* rcsid
|
||||
*
|
||||
* Revision 1.13 1997/09/05 16:34:36 mradwin
|
||||
* GPL-ized code.
|
||||
*
|
||||
* Revision 1.12 1997/09/05 16:13:18 mradwin
|
||||
* changed email address to acm.org
|
||||
*
|
||||
* Revision 1.11 1996/09/12 14:44:49 mjr
|
||||
* Added throw decl recognition (great, another 4 bytes in syntaxelem)
|
||||
* and cleaned up the grammar so that const_opt appears in far fewer
|
||||
* places. const_opt is by default 0 as well, so we don't need to
|
||||
* pass it as an arg to new_elem().
|
||||
*
|
||||
* I also added a fix to a potential bug with the MINIT and INLIN
|
||||
* exclusive start states. I think they could have been confused
|
||||
* by braces within comments, so now I'm grabbing comments in those
|
||||
* states as well.
|
||||
*
|
||||
* Revision 1.10 1996/09/12 03:46:10 mjr
|
||||
* No concrete changes in code. Just added some sanity by
|
||||
* factoring out code into util.[ch] and putting some prototypes
|
||||
* that were in table.h into stubgen.y where they belong.
|
||||
*
|
||||
* Revision 1.9 1996/09/01 20:59:48 mjr
|
||||
* Added collectMemberInitList() function, which is similar
|
||||
* to collectInlineDef() and also the exclusive state MINIT
|
||||
*
|
||||
* Revision 1.8 1996/08/23 05:09:19 mjr
|
||||
* fixed up some more portability things
|
||||
*
|
||||
* Revision 1.7 1996/08/22 02:43:47 mjr
|
||||
* added parse error message (using O'Reilly p. 274)
|
||||
*
|
||||
* Revision 1.6 1996/08/21 18:33:50 mjr
|
||||
* removed the buffer for inlines. we don't care anyway.
|
||||
* now we can't overflow on inlines!
|
||||
*
|
||||
* Revision 1.5 1996/08/21 17:40:56 mjr
|
||||
* added some cpp directives for porting to WIN32
|
||||
*
|
||||
* Revision 1.4 1996/08/19 17:01:33 mjr
|
||||
* no echo now
|
||||
*
|
||||
* Revision 1.3 1996/08/15 21:24:58 mjr
|
||||
* *** empty log message ***
|
||||
*/
|
||||
%}
|
||||
|
||||
D [0-9]
|
||||
L [a-zA-Z_]
|
||||
H [a-fA-F0-9]
|
||||
E [Ee][+-]?{D}+
|
||||
FS (f|F|l|L)
|
||||
IS (u|U|l|L)*
|
||||
|
||||
%{
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include "table.h"
|
||||
#include "util.h"
|
||||
|
||||
#ifdef WIN32
|
||||
/* definitions of exit, malloc, realloc, and free */
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#if 0 /* #ifdef WIN32 */
|
||||
#include "y_tab.h"
|
||||
#else
|
||||
#include "y.tab.h"
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
#define STUB_INPUT() yyinput()
|
||||
#else
|
||||
#define STUB_INPUT() input()
|
||||
#endif
|
||||
|
||||
/* when we return a string, duplicate it so we can free it later.
|
||||
we always allocate memory so we can uniformly free() it. */
|
||||
#define RETURN_STR(x) tokens_seen++; yylval.string = strdup(yytext); return(x)
|
||||
|
||||
/* make that nasty union a value that will bus error if we misinterpret
|
||||
the value as a pointer */
|
||||
#define RETURN_VAL(x) tokens_seen++; yylval.flag = 37; return(x)
|
||||
|
||||
static const char rcsid[] = "$Id: lexer.l,v 1.1 2002-06-06 22:09:16 ocoursiere Exp $";
|
||||
|
||||
static void count();
|
||||
static void comment();
|
||||
static void macro();
|
||||
|
||||
char linebuf[1024]; /* null-terminated at beginning of each file */
|
||||
int lineno; /* set to 1 at beginning of each file */
|
||||
int column; /* set to 0 at beginning of each file */
|
||||
int tokens_seen; /* set to 0 at beginning of each file */
|
||||
|
||||
%}
|
||||
|
||||
%x INLIN MINIT
|
||||
%%
|
||||
\n.* { /*
|
||||
* for debugging purposes, we grab an entire
|
||||
* line and buffer it, then grab tokens out of
|
||||
* it. This lets us have more informative
|
||||
* error messages. See yyerror() in parser.y
|
||||
*/
|
||||
strncpy(linebuf, yytext+1, 1024);
|
||||
lineno++;
|
||||
column = 0;
|
||||
yyless(1); /* give back everything but \n */
|
||||
}
|
||||
"/*" { comment(); }
|
||||
|
||||
"//".* { count(); }
|
||||
"#" { macro(); /* was #.* { count(); } */ }
|
||||
|
||||
"static" { count(); tokens_seen++; }
|
||||
"volatile" { count(); tokens_seen++; }
|
||||
"auto" { count(); tokens_seen++; }
|
||||
"extern" { count(); RETURN_VAL(EXTERN); }
|
||||
"register" { count(); tokens_seen++; }
|
||||
"typedef" { count(); tokens_seen++; }
|
||||
"struct" { count(); RETURN_VAL(STRUCT); }
|
||||
"union" { count(); RETURN_VAL(UNION); }
|
||||
"enum" { count(); RETURN_VAL(ENUM); }
|
||||
"const" { count(); RETURN_VAL(CONST); }
|
||||
"template" { count(); RETURN_VAL(TEMPLATE); }
|
||||
|
||||
"typename" { count(); tokens_seen++; /* FIXME */ }
|
||||
"using" { count(); tokens_seen++; /* FIXME */ }
|
||||
"namespace" { count(); RETURN_VAL(CLASS); /* FIXME */ }
|
||||
|
||||
"dllexport" { count(); tokens_seen++; }
|
||||
"dllimport" { count(); tokens_seen++; }
|
||||
|
||||
"explicit" { count(); tokens_seen++; }
|
||||
"mutable" { count(); tokens_seen++; }
|
||||
"inline" { count(); tokens_seen++; }
|
||||
"virtual" { count(); tokens_seen++; }
|
||||
"class" { count(); RETURN_VAL(CLASS); }
|
||||
"delete" { count(); RETURN_VAL(DELETE); }
|
||||
"new" { count(); RETURN_VAL(NEW); }
|
||||
"friend" { count(); RETURN_VAL(FRIEND); }
|
||||
"operator" { count(); RETURN_VAL(OPERATOR); }
|
||||
"protected" { count(); RETURN_VAL(PROTECTED); }
|
||||
"private" { count(); RETURN_VAL(PRIVATE); }
|
||||
"public" { count(); RETURN_VAL(PUBLIC); }
|
||||
"throw" { count(); RETURN_VAL(THROW); }
|
||||
|
||||
"char" { count(); RETURN_STR(CHAR); }
|
||||
"short" { count(); RETURN_STR(SHORT); }
|
||||
"int" { count(); RETURN_STR(INT); }
|
||||
"long" { count(); RETURN_STR(LONG); }
|
||||
"signed" { count(); RETURN_STR(SIGNED); }
|
||||
"unsigned" { count(); RETURN_STR(UNSIGNED); }
|
||||
"float" { count(); RETURN_STR(FLOAT); }
|
||||
"double" { count(); RETURN_STR(DOUBLE); }
|
||||
"void" { count(); RETURN_STR(VOID); }
|
||||
|
||||
{L}({L}|{D})* { count(); RETURN_STR(IDENTIFIER); }
|
||||
|
||||
0[xX]{H}+{IS}? { count(); RETURN_STR(CONSTANT); }
|
||||
0{D}+{IS}? { count(); RETURN_STR(CONSTANT); }
|
||||
{D}+{IS}? { count(); RETURN_STR(CONSTANT); }
|
||||
'(\\.|[^\\'])+' { count(); RETURN_STR(CONSTANT); /* 'fontlck */ }
|
||||
|
||||
{D}+{E}{FS}? { count(); RETURN_STR(CONSTANT); }
|
||||
{D}*"."{D}+({E})?{FS}? { count(); RETURN_STR(CONSTANT); }
|
||||
{D}+"."{D}*({E})?{FS}? { count(); RETURN_STR(CONSTANT); }
|
||||
|
||||
\"(\\.|[^\\"])*\" { count(); RETURN_STR(STRING_LITERAL); /* "fontlck */ }
|
||||
|
||||
">>=" { count(); RETURN_VAL(RIGHT_ASSIGN); }
|
||||
"<<=" { count(); RETURN_VAL(LEFT_ASSIGN); }
|
||||
"+=" { count(); RETURN_VAL(ADD_ASSIGN); }
|
||||
"-=" { count(); RETURN_VAL(SUB_ASSIGN); }
|
||||
"*=" { count(); RETURN_VAL(MUL_ASSIGN); }
|
||||
"/=" { count(); RETURN_VAL(DIV_ASSIGN); }
|
||||
"%=" { count(); RETURN_VAL(MOD_ASSIGN); }
|
||||
"&=" { count(); RETURN_VAL(AND_ASSIGN); }
|
||||
"^=" { count(); RETURN_VAL(XOR_ASSIGN); }
|
||||
"|=" { count(); RETURN_VAL(OR_ASSIGN); }
|
||||
">>" { count(); RETURN_VAL(RIGHT_OP); }
|
||||
"<<" { count(); RETURN_VAL(LEFT_OP); }
|
||||
"++" { count(); RETURN_VAL(INC_OP); }
|
||||
"--" { count(); RETURN_VAL(DEC_OP); }
|
||||
"->" { count(); RETURN_VAL(PTR_OP); }
|
||||
"->*" { count(); RETURN_VAL(MEM_PTR_OP); }
|
||||
"&&" { count(); RETURN_VAL(AND_OP); }
|
||||
"||" { count(); RETURN_VAL(OR_OP); }
|
||||
"<=" { count(); RETURN_VAL(LE_OP); }
|
||||
">=" { count(); RETURN_VAL(GE_OP); }
|
||||
"==" { count(); RETURN_VAL(EQ_OP); }
|
||||
"!=" { count(); RETURN_VAL(NE_OP); }
|
||||
";" { count(); RETURN_VAL(';'); }
|
||||
"{" { count(); RETURN_VAL('{'); }
|
||||
"}" { count(); RETURN_VAL('}'); }
|
||||
"," { count(); RETURN_VAL(','); }
|
||||
":" { count(); RETURN_VAL(':'); }
|
||||
"=" { count(); RETURN_VAL('='); }
|
||||
"(" { count(); RETURN_VAL('('); }
|
||||
")" { count(); RETURN_VAL(')'); }
|
||||
"[" { count(); RETURN_VAL('['); }
|
||||
"]" { count(); RETURN_VAL(']'); }
|
||||
"." { count(); RETURN_VAL('.'); }
|
||||
"&" { count(); RETURN_VAL('&'); }
|
||||
"!" { count(); RETURN_VAL('!'); }
|
||||
"~" { count(); RETURN_VAL('~'); }
|
||||
"-" { count(); RETURN_VAL('-'); }
|
||||
"+" { count(); RETURN_VAL('+'); }
|
||||
"*" { count(); RETURN_VAL('*'); }
|
||||
"/" { count(); RETURN_VAL('/'); }
|
||||
"%" { count(); RETURN_VAL('%'); }
|
||||
"<" { count(); RETURN_VAL('<'); }
|
||||
">" { count(); RETURN_VAL('>'); }
|
||||
"^" { count(); RETURN_VAL('^'); }
|
||||
"|" { count(); RETURN_VAL('|'); }
|
||||
"?" { count(); RETURN_VAL('?'); }
|
||||
"::" { count(); RETURN_VAL(CLCL); }
|
||||
"..." { count(); RETURN_VAL(ELIPSIS); }
|
||||
|
||||
<INLIN>"/*" { comment(); }
|
||||
<INLIN>"//".* { count(); }
|
||||
<INLIN>"#" { macro(); /* was #.* { count(); } */ }
|
||||
<INLIN>. |
|
||||
<INLIN>\n { RETURN_VAL((int) yytext[0]); }
|
||||
|
||||
<MINIT>"/*" { comment(); }
|
||||
<MINIT>"//".* { count(); }
|
||||
<MINIT>"#" { macro(); /* was #.* { count(); } */ }
|
||||
<MINIT>. |
|
||||
<MINIT>\n { RETURN_VAL((int) yytext[0]); }
|
||||
|
||||
[ \t\v\f] { count(); }
|
||||
. { count(); /* ignore bad characters */ }
|
||||
|
||||
%%
|
||||
|
||||
/*
|
||||
* called when EOF is encountered. Return 1 so the scanner will return
|
||||
* the zero token to report end-of-file.
|
||||
*/
|
||||
int yywrap()
|
||||
{
|
||||
return(1);
|
||||
}
|
||||
|
||||
static void comment()
|
||||
{
|
||||
int c1 = 0, c2 = STUB_INPUT();
|
||||
|
||||
linebuf[column] = c2;
|
||||
column++;
|
||||
for(;;) {
|
||||
if (c2 == EOF)
|
||||
break;
|
||||
if (c1 == '*' && c2 == '/')
|
||||
break;
|
||||
if (c2 == '\n') {
|
||||
linebuf[0] = '\0';
|
||||
column = 0;
|
||||
lineno++;
|
||||
}
|
||||
|
||||
c1 = c2;
|
||||
c2 = STUB_INPUT();
|
||||
linebuf[column] = c2;
|
||||
column++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void macro()
|
||||
{
|
||||
int c1 = 0, c2 = STUB_INPUT(), nonws = 0;
|
||||
|
||||
log_printf("MACRO reading begining...\n#");
|
||||
log_printf("%c", c2);
|
||||
|
||||
linebuf[column] = c2;
|
||||
column++;
|
||||
for(;;) {
|
||||
if (c2 == EOF)
|
||||
break;
|
||||
if (!isspace(c1))
|
||||
nonws = c1;
|
||||
if (nonws == '\\' && c2 == '\n') {
|
||||
linebuf[0] = '\0';
|
||||
column = 0;
|
||||
lineno++;
|
||||
} else if (c2 == '\n') {
|
||||
linebuf[0] = '\0';
|
||||
column = 0;
|
||||
lineno++;
|
||||
break;
|
||||
}
|
||||
|
||||
c1 = c2;
|
||||
c2 = STUB_INPUT();
|
||||
linebuf[column] = c2;
|
||||
log_printf("%c", c2);
|
||||
column++;
|
||||
}
|
||||
log_printf("MACRO reading done.\n");
|
||||
}
|
||||
|
||||
|
||||
static void count()
|
||||
{
|
||||
int i;
|
||||
|
||||
if (lineno == 1)
|
||||
strcat(linebuf, yytext);
|
||||
|
||||
for (i = 0; yytext[i] != '\0'; i++)
|
||||
if (yytext[i] == '\n')
|
||||
column = 0;
|
||||
else if (yytext[i] == '\t')
|
||||
column += 8 - (column % 8);
|
||||
else
|
||||
column++;
|
||||
|
||||
/* equiv to fprintf(yyout, "%s", yytext); */
|
||||
/* ECHO; */
|
||||
}
|
||||
|
||||
/*
|
||||
* Collect the contents of inline functions, reading them char by char.
|
||||
* thanks to the arjuna stubgen project for this one
|
||||
*/
|
||||
int collectInlineDef()
|
||||
{
|
||||
int bracelevel = 1;
|
||||
int token;
|
||||
|
||||
/* the magic of exclusive start states makes it all possible */
|
||||
BEGIN INLIN;
|
||||
|
||||
while (bracelevel > 0) {
|
||||
token = yylex();
|
||||
column++;
|
||||
/* fprintf(stderr, "INLIN: read token %c\n", token); */
|
||||
if (token > 0) {
|
||||
/* Assume single char */
|
||||
switch (token) {
|
||||
case '{':
|
||||
bracelevel++;
|
||||
break;
|
||||
case '}':
|
||||
bracelevel--;
|
||||
if (bracelevel == 0)
|
||||
{
|
||||
column--;
|
||||
unput(token);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case '\n':
|
||||
column = 0;
|
||||
lineno++;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
/* fatal error: Unexpected EOF reading inline function */
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* we now return you to your regularly scheduled start state */
|
||||
BEGIN 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* hmmm... looks familiar. more control-y programming.
|
||||
*/
|
||||
int collectMemberInitList()
|
||||
{
|
||||
int token;
|
||||
int insideList = 1;
|
||||
|
||||
/* the magic of exclusive start states makes it all possible */
|
||||
BEGIN MINIT;
|
||||
|
||||
while(insideList) {
|
||||
token = yylex();
|
||||
column++;
|
||||
/* fprintf(stderr, "MINIT: read token %c\n", token); */
|
||||
if (token > 0) {
|
||||
/* Assume single char */
|
||||
switch (token)
|
||||
{
|
||||
case '{':
|
||||
insideList = 0;
|
||||
unput(token);
|
||||
break;
|
||||
case '\n':
|
||||
column = 0;
|
||||
lineno++;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
/* fatal error: Unexpected EOF reading member initialization */
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* we now return you to your regularly scheduled start state */
|
||||
BEGIN 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
892
bepascal/bepascal/stubgen/main.c
Normal file
892
bepascal/bepascal/stubgen/main.c
Normal file
@@ -0,0 +1,892 @@
|
||||
/*
|
||||
* FILE: main.c
|
||||
* AUTH: Michael John Radwin <mjr@acm.org>
|
||||
*
|
||||
* DESC: stubgen code generation routines
|
||||
*
|
||||
* DATE: Thu Nov 13 13:28:23 PST 1997
|
||||
* $Id: main.c,v 1.1 2002-06-06 22:09:16 ocoursiere Exp $
|
||||
*
|
||||
* Copyright (c) 1996-1998 Michael John Radwin
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
// modified version for the BeFPC project by Olivier Coursière
|
||||
// Mai-June 2002
|
||||
|
||||
#include "table.h"
|
||||
#include "util.h"
|
||||
#include "pathname.h"
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#include <assert.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#include <windows.h> /* defintion of GetUserName(), BOOL, etc. */
|
||||
#include <lmaccess.h>
|
||||
#include <malloc.h> /* defintion of alloca() */
|
||||
#include "getopt.h" /* use GNU getopt */
|
||||
#else /* !WIN32 */
|
||||
#include <pwd.h>
|
||||
#endif /* WIN32 */
|
||||
|
||||
/* protos */
|
||||
static void debug_printf(syntaxelem_t *);
|
||||
static void generate_skel(syntaxelem_t *);
|
||||
static void print_function(syntaxelem_t *, syntaxelem_t *);
|
||||
static void function_hdr(syntaxelem_t *, syntaxelem_t *);
|
||||
static void file_hdr();
|
||||
static void scan_and_generate(FILE *);
|
||||
static void scan_existing_skeleton();
|
||||
|
||||
/* duplicating variable names from stubgen.pl */
|
||||
static const char *OPTS = "hqrivgae:cdbfsn";
|
||||
int opt_h = 0, opt_q = 0, opt_r = 0, opt_i = 0;
|
||||
int opt_v = 0, opt_g = 0, opt_a = 0;
|
||||
int opt_c = 0, opt_d = 0;
|
||||
int opt_b = 0, opt_f = 0, opt_s = 0, opt_n = 0;
|
||||
char *opt_e = "cpp";
|
||||
|
||||
int using_stdio = 0;
|
||||
static int new_functions = 0, fileOpened = 0, fileExisted = 0;
|
||||
static int inform_indent = 0;
|
||||
|
||||
#ifdef SGDEBUG
|
||||
static const char *logfilename = "stubgen.log";
|
||||
#endif /* SGDEBUG */
|
||||
|
||||
FILE *outfile = NULL;
|
||||
static char *inPath = NULL, *outPath = NULL;
|
||||
char *currentFile = "";
|
||||
static const char *lots_of_stars =
|
||||
"***********************************************************************";
|
||||
static const char *progname = "stubgen";
|
||||
static const char rcsid[] = "$Id: main.c,v 1.1 2002-06-06 22:09:16 ocoursiere Exp $";
|
||||
static const char *progver = "2.05";
|
||||
|
||||
static const char *copyright =
|
||||
"Copyright (c) 1996-1998 Michael John Radwin";
|
||||
|
||||
static const char *version_info =
|
||||
"Distributed under the GNU General Public License.\n\
|
||||
See http://www.radwin.org/michael/projects/stubgen/ for more information.\n";
|
||||
|
||||
static const char *usage =
|
||||
"usage: %s [-hqrivgacd] [-e ext] [-{bfsn}] [infiles]\n\
|
||||
OPTIONS\n\
|
||||
-h Display usage information.\n\
|
||||
-q Quiet mode, no status information while generating code.\n\
|
||||
-r Make RCS-style file headers.\n\
|
||||
-i Don't put the #include \"my_file.H\" directive in my_file.cpp\n\
|
||||
-v Display version information.\n\
|
||||
-g Generate dummy return statements for functions.\n\
|
||||
-a Split function arguments over multiple lines.\n\
|
||||
-c Print debugging output with cerrs (#include <iostream.h>).\n\
|
||||
-d Print debugging output with dprintfs (#include <Debug.H>).\n\
|
||||
-e ext Generate source files with extension '.ext' (default '.cpp').\n\
|
||||
\n\
|
||||
METHOD HEADER STYLES\n\
|
||||
-b Block method headers (default).\n\
|
||||
-f Full method headers: like block, but less asterisks.\n\
|
||||
-s Simple method headers: only \"Method\" and \"Descr\" fields.\n\
|
||||
-n No method headers.\n";
|
||||
|
||||
//
|
||||
static int nbConstructor = 0;
|
||||
|
||||
static char *prec_function_name = "";
|
||||
|
||||
/* string manipulation functions. Found on the web
|
||||
added for the BeFPC project
|
||||
*/
|
||||
|
||||
#define UP_CASE(ch) ((ch) & 223) /* turn 6'th least sig. bit ON */
|
||||
#define LOW_CASE(ch) ((ch) | 32) /* turn 6'th least sig. bit OFF */
|
||||
|
||||
|
||||
/* Return the index (pos) of a char in a string or -1 if not found */
|
||||
|
||||
int index( s, c)
|
||||
char *s,c;
|
||||
{
|
||||
unsigned int i = (unsigned int) s + 1;
|
||||
|
||||
while (*s)
|
||||
if (*s++ == c)
|
||||
return((unsigned int) s - i);
|
||||
|
||||
return(-1);
|
||||
}
|
||||
|
||||
// #include <jaz.h> // OCoursiere : it appears that this header is just need
|
||||
// to include a min function
|
||||
|
||||
int min(int Val1, int Val2)
|
||||
{
|
||||
if (Val1 < Val2)
|
||||
return Val1;
|
||||
else
|
||||
return Val2;
|
||||
}
|
||||
|
||||
/*
|
||||
Insert a string into another string at a given index position. Note that the
|
||||
starting position is the index, not the character number like in pascal!.
|
||||
*/
|
||||
|
||||
void jzinsstr(fdestin,fsource,fstart)
|
||||
char *fdestin;
|
||||
char *fsource;
|
||||
int fstart;
|
||||
{
|
||||
|
||||
int wdlen,wslen;
|
||||
int w,wlen,wpad;
|
||||
|
||||
wdlen = strlen(fdestin); /* get destination string length */
|
||||
wslen = strlen(fsource); /* get source string length */
|
||||
|
||||
wlen = min(fstart,wdlen); /* don't initially point past destin */
|
||||
|
||||
wpad = fstart - wlen; /* get extra length to pad */
|
||||
|
||||
for (w = wlen ; w < fstart ; w ++) /* pad with blanks if neccessary */
|
||||
fdestin[w] = ' ';
|
||||
|
||||
/* start at end of string and move characters to the right */
|
||||
/* draw it out if necessary; It's hard to follow if you don't */
|
||||
|
||||
for (w = wdlen + wslen - 1 ; w >= fstart + wslen ; w --)
|
||||
fdestin[w] = fdestin[w - wslen];
|
||||
|
||||
for (w = 0 ; w < wslen ; w ++) /* now insert into the dest string */
|
||||
fdestin[w+fstart] = *fsource++;
|
||||
|
||||
fdestin[wslen+wdlen+wpad] = 0; /* string is bigger, needs NULL */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Return the substring of a string.
|
||||
Specify the String, the starting position, and the number of chars to copy
|
||||
*/
|
||||
// OCoursiere : the function i need to cut 'B' in class names
|
||||
char *jzmidstr(fstr,ffrom,flen)
|
||||
char *fstr;
|
||||
int ffrom,flen;
|
||||
{
|
||||
static char wstr[256]; /* static work buffer */
|
||||
unsigned int wlen,newlen;
|
||||
|
||||
if ((wlen = strlen(fstr)) < (ffrom+1)) /* don't go beyond string */
|
||||
return(0);
|
||||
|
||||
strncpy(wstr, fstr + ffrom, flen); /* copy into work storage */
|
||||
|
||||
newlen = flen - ffrom + 1;
|
||||
|
||||
if (newlen >= flen)
|
||||
wstr[newlen] = 0;
|
||||
|
||||
return(wstr);
|
||||
|
||||
}
|
||||
|
||||
/* End string manipulation functions */
|
||||
|
||||
static void generate_skel(syntaxelem_t *elt)
|
||||
{
|
||||
syntaxelem_t *e;
|
||||
log_printf("generate_skel called: %s\n", elt->name);
|
||||
if (elt->kind != CLASS_KIND && elt->kind != STRUCT_KIND)
|
||||
return;
|
||||
|
||||
inform_user("%*s==> %s %s", inform_indent, "",
|
||||
(elt->kind == CLASS_KIND ? "class " : "struct"),
|
||||
elt->name);
|
||||
if (inform_indent == 0)
|
||||
inform_user(" (file %s)", inPath);
|
||||
else
|
||||
inform_user(" (nested class)");
|
||||
inform_user("\n");
|
||||
inform_indent += 4;
|
||||
|
||||
nbConstructor = 0;
|
||||
|
||||
for (e = elt->children; e != NULL; e = e->next) {
|
||||
if (e->kind == FUNC_KIND) {
|
||||
char *arg_str = args_to_string(e->args, 0);
|
||||
log_printf(">>>>>>> generating %s: %s %s::%s(%s) %s\n",
|
||||
string_kind(e->kind),
|
||||
e->ret_type, elt->name, e->name, arg_str,
|
||||
(e->const_flag) ? "const" : "");
|
||||
free(arg_str);
|
||||
print_se(e);
|
||||
print_function(e, elt);
|
||||
e->kind = DONE_FUNC_KIND;
|
||||
} else if (e->kind == CLASS_KIND || e->kind == STRUCT_KIND) {
|
||||
/* nested class */
|
||||
char *tmp_str = (char *) malloc(strlen(elt->name) + strlen(e->name) + 3);
|
||||
sprintf(tmp_str, "%s::%s", elt->name, e->name);
|
||||
free(e->name);
|
||||
e->name = tmp_str;
|
||||
|
||||
log_printf(">>>>>>> generating NESTED %s: %s\n",
|
||||
string_kind(e->kind), e->name);
|
||||
print_se(e);
|
||||
generate_skel(e);
|
||||
free(tmp_str);
|
||||
} else {
|
||||
log_printf("------> ignoring %s: %s\n",
|
||||
string_kind(e->kind), e->name);
|
||||
}
|
||||
}
|
||||
|
||||
inform_indent -= 4;
|
||||
inform_user("%*s==> %s %s", inform_indent, "",
|
||||
(elt->kind == CLASS_KIND ? "class " : "struct"),
|
||||
elt->name);
|
||||
if (inform_indent == 0)
|
||||
inform_user(" (%d functions appended to %s)", new_functions, outPath);
|
||||
else
|
||||
inform_user(" (end nested class)");
|
||||
inform_user("\n");
|
||||
|
||||
elt->kind = DONE_CLASS_KIND;
|
||||
}
|
||||
|
||||
// Adapted to generate C++ glue code for the befpc project
|
||||
static void print_function(syntaxelem_t *elt, syntaxelem_t *classe)
|
||||
{
|
||||
syntaxelem_t *e;
|
||||
|
||||
char * test = "P";
|
||||
|
||||
if (find_skeleton(elt))
|
||||
{
|
||||
log_printf("find_skeleton() returned true for this elt:\n");
|
||||
print_se(elt);
|
||||
return;
|
||||
}
|
||||
|
||||
new_functions++;
|
||||
if (!fileOpened)
|
||||
{
|
||||
fileOpened = 1;
|
||||
|
||||
if (using_stdio)
|
||||
{
|
||||
fileExisted = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* test for existence */
|
||||
outfile = fopen(outPath, "r");
|
||||
if (outfile != NULL)
|
||||
{
|
||||
fileExisted = 1;
|
||||
fclose(outfile);
|
||||
}
|
||||
|
||||
/* do the fopen */
|
||||
log_printf("writing to %s\n", outPath);
|
||||
outfile = fopen(outPath, "a");
|
||||
if (outfile == NULL)
|
||||
{
|
||||
/* open failed */
|
||||
fatal(1, "%s: cannot open %s\n", progname, outPath);
|
||||
}
|
||||
}
|
||||
|
||||
if (!fileExisted) file_hdr();
|
||||
}
|
||||
|
||||
inform_user("%*s%s\n", inform_indent, "", elt->name);
|
||||
function_hdr(elt, classe);
|
||||
for (e = elt->parent; e != NULL; e = e->parent)
|
||||
{
|
||||
if (e->templ)
|
||||
{
|
||||
fprintf(outfile, "%s\n", e->templ);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
{ /* scope for local vars */
|
||||
char *arg_str;
|
||||
char *arg_str_name;
|
||||
|
||||
char *ClassName;
|
||||
|
||||
char *Suffixe;
|
||||
|
||||
// Extract the class name without the 'B' prefix
|
||||
// (without the first char)
|
||||
ClassName = jzmidstr(classe->name, 1, strlen(classe->name));
|
||||
|
||||
if (strncmp(elt->name, prec_function_name, strlen(prec_function_name)) == 0)
|
||||
{
|
||||
if (strlen(prec_function_name) > 0)
|
||||
free(prec_function_name);
|
||||
prec_function_name = (char *) malloc(strlen(elt->name) + 1);
|
||||
strcpy(prec_function_name, elt->name);
|
||||
if (nbConstructor == 0)
|
||||
{
|
||||
Suffixe = "";
|
||||
}
|
||||
else
|
||||
{
|
||||
Suffixe = (char *) malloc(5);
|
||||
sprintf(Suffixe, "_%d\n", nbConstructor);
|
||||
}
|
||||
|
||||
nbConstructor++;
|
||||
}
|
||||
else
|
||||
{
|
||||
nbConstructor = 0;
|
||||
if (strlen(prec_function_name) > 0)
|
||||
free(prec_function_name);
|
||||
prec_function_name = (char *) malloc(strlen(elt->name) + 1);
|
||||
strcpy(prec_function_name, elt->name);
|
||||
if (nbConstructor == 0)
|
||||
{
|
||||
Suffixe = "";
|
||||
}
|
||||
else
|
||||
{
|
||||
Suffixe = (char *) malloc(5);
|
||||
sprintf(Suffixe, "_%d", nbConstructor);
|
||||
}
|
||||
nbConstructor++;
|
||||
}
|
||||
|
||||
|
||||
if (strncmp(elt->name, classe->name, strlen(elt->name)) == 0)
|
||||
{
|
||||
// constructor
|
||||
fprintf(outfile, "TCPlusObject %s%s%s_Create%s(TPasObject PasObject",
|
||||
elt->ret_type, (strcmp(elt->ret_type, "") ? "\n" : ""),
|
||||
classe->name, Suffixe);
|
||||
// nbConstructor++;
|
||||
}
|
||||
else
|
||||
fprintf(outfile, "%s%s%s_%s%s(%s *%s",
|
||||
elt->ret_type, (strcmp(elt->ret_type, "") ? "\n" : ""),
|
||||
elt->parent->name, elt->name, Suffixe,
|
||||
classe->name, ClassName);
|
||||
|
||||
arg_str = args_to_string(
|
||||
elt->args,
|
||||
opt_a ? strlen(elt->parent->name) + strlen(elt->name) + 3 : 0);
|
||||
|
||||
arg_str_name = args_to_string_name(
|
||||
elt->args,
|
||||
opt_a ? strlen(elt->parent->name) + strlen(elt->name) + 3 : 0);
|
||||
|
||||
if (elt->args == 0)
|
||||
fprintf(outfile, "%s)", arg_str);
|
||||
else
|
||||
fprintf(outfile, ", %s)", arg_str);
|
||||
|
||||
if (elt->throw_decl)
|
||||
fprintf(outfile, " %s", elt->throw_decl);
|
||||
|
||||
if (elt->const_flag)
|
||||
fprintf(outfile, " const");
|
||||
|
||||
fprintf(outfile, "\n{\n");
|
||||
|
||||
if (strncmp(elt->name, classe->name, strlen(elt->name)) == 0)
|
||||
{
|
||||
char *toto = (char *) malloc(strlen(classe->name) + 100);
|
||||
strcpy(toto, classe->name);
|
||||
jzinsstr(toto, test, 1);
|
||||
fprintf(outfile, " return new %s(PasObject",
|
||||
toto);
|
||||
free(toto);
|
||||
if (elt->args == 0)
|
||||
fprintf(outfile, ");\n");
|
||||
else
|
||||
fprintf(outfile, ", %s);\n", arg_str_name);
|
||||
}
|
||||
|
||||
// Generate stub code
|
||||
else if (strncmp(elt->ret_type, "void", 4) == 0)
|
||||
// procedure
|
||||
fprintf(outfile, " %s->%s(%s);\n", ClassName, elt->name, arg_str_name);
|
||||
else
|
||||
// function
|
||||
fprintf(outfile, " return %s->%s(%s);\n", ClassName, elt->name, arg_str_name);
|
||||
|
||||
free(ClassName);
|
||||
free(arg_str_name);
|
||||
free(arg_str);
|
||||
free(Suffixe);
|
||||
|
||||
|
||||
}
|
||||
|
||||
// debug_printf(elt);
|
||||
fprintf(outfile, "}\n\n\n");
|
||||
}
|
||||
|
||||
static void function_hdr(syntaxelem_t *elt, syntaxelem_t *classe)
|
||||
{
|
||||
if (opt_n)
|
||||
return;
|
||||
|
||||
fprintf(outfile, "/%s\n", (opt_b ? lots_of_stars : "*"));
|
||||
fprintf(outfile, " * Method: %s::%s%s\n", elt->parent->name, elt->name,
|
||||
(opt_s ? "()" : ""));
|
||||
|
||||
if (opt_s) {
|
||||
fprintf(outfile, " * Descr: \n");
|
||||
|
||||
} else {
|
||||
char *arg_str = args_to_string(elt->args, 0);
|
||||
fprintf(outfile, " * Params: %s\n", arg_str);
|
||||
if (strcmp(elt->ret_type, ""))
|
||||
fprintf(outfile, " * Returns: %s\n", elt->ret_type);
|
||||
fprintf(outfile, " * Effects: \n");
|
||||
free(arg_str);
|
||||
}
|
||||
|
||||
fprintf(outfile, " %s/\n", (opt_b ? lots_of_stars : "*"));
|
||||
}
|
||||
|
||||
#ifdef WIN32
|
||||
static BOOL win32_fullname(const char *login, char *dest)
|
||||
{
|
||||
WCHAR wszLogin[256]; /* Unicode user name */
|
||||
struct _USER_INFO_10 *ui; /* User structure */
|
||||
|
||||
/* Convert ASCII user name to Unicode. */
|
||||
MultiByteToWideChar(CP_ACP, 0, login,
|
||||
strlen(login)+1, wszLogin, sizeof(wszLogin));
|
||||
|
||||
/* Look up the user on the DC. This function only works for
|
||||
* Windows NT, and not Windows 95. */
|
||||
if (NetUserGetInfo(NULL, (LPWSTR) &wszLogin, 10, (LPBYTE *) &ui))
|
||||
return FALSE;
|
||||
|
||||
/* Convert the Unicode full name to ASCII. */
|
||||
WideCharToMultiByte(CP_ACP, 0, ui->usri10_full_name,
|
||||
-1, dest, 256, NULL, NULL);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
#endif /* WIN32 */
|
||||
|
||||
static char *sg_getlogin()
|
||||
{
|
||||
static char *login;
|
||||
#ifdef WIN32
|
||||
static char login_buffer[256];
|
||||
DWORD size;
|
||||
#endif /* WIN32 */
|
||||
static int sg_getlogin_called = 0;
|
||||
|
||||
if (sg_getlogin_called)
|
||||
return login;
|
||||
else
|
||||
sg_getlogin_called = 1;
|
||||
|
||||
#ifdef WIN32
|
||||
if ((login = getenv("USERNAME")) == NULL) {
|
||||
if ((login = getenv("USER")) == NULL) {
|
||||
size = 255;
|
||||
login = login_buffer;
|
||||
if (GetUserName(login_buffer, &size) == FALSE)
|
||||
login = "nobody";
|
||||
}
|
||||
}
|
||||
#else /* !WIN32 */
|
||||
if ((login = getenv("USER")) == NULL)
|
||||
if ((login = getlogin()) == NULL)
|
||||
login = "nobody";
|
||||
#endif /* WIN32 */
|
||||
|
||||
return login;
|
||||
}
|
||||
|
||||
static char *sg_getfullname(const char *login)
|
||||
{
|
||||
char *fullname;
|
||||
static char fullname_buffer[256];
|
||||
#ifndef WIN32
|
||||
char *comma;
|
||||
struct passwd *pw;
|
||||
#endif /* WIN32 */
|
||||
|
||||
#ifdef WIN32
|
||||
fullname = fullname_buffer;
|
||||
|
||||
if (win32_fullname(login, fullname_buffer) == FALSE)
|
||||
fullname = "nobody";
|
||||
#else /* !WIN32 */
|
||||
if ((fullname = getenv("NAME")) == NULL) {
|
||||
setpwent();
|
||||
pw = getpwnam(login);
|
||||
if (pw == NULL) {
|
||||
fullname = "nobody";
|
||||
} else {
|
||||
strncpy(fullname_buffer, pw->pw_gecos, 256);
|
||||
comma = strchr(fullname_buffer, ',');
|
||||
if (comma) *comma = '\0';
|
||||
fullname = fullname_buffer;
|
||||
}
|
||||
endpwent();
|
||||
}
|
||||
#endif /* WIN32 */
|
||||
|
||||
return fullname;
|
||||
}
|
||||
|
||||
|
||||
static void file_hdr() {
|
||||
char domain[256], *tmp;
|
||||
time_t now = time(0);
|
||||
char *today = ctime(&now);
|
||||
char *login = sg_getlogin();
|
||||
char *fullname = sg_getfullname(login);
|
||||
|
||||
log_printf("login: %s, full name: %s\n", login, fullname);
|
||||
|
||||
domain[0] = '\0';
|
||||
if ((tmp = getenv("STUBGEN_DOM")) != NULL)
|
||||
sprintf(domain, "@%s", tmp);
|
||||
|
||||
if (opt_r) {
|
||||
fprintf(outfile, "/*\n * FILE: %s\n * AUTH: %s <%s%s>\n", outPath, fullname, login, domain);
|
||||
/* no '\n' needed with ctime() */
|
||||
fprintf(outfile, " *\n * DESC: \n *\n * DATE: %s * %sId$ \n *\n", today, "$");
|
||||
fprintf(outfile, " * %sLog$\n", "$");
|
||||
fprintf(outfile, " *\n */\n");
|
||||
|
||||
} else {
|
||||
fprintf(outfile, "/%s\n", lots_of_stars);
|
||||
fprintf(outfile, " * AUTHOR: %s <%s%s>\n", fullname, login, domain);
|
||||
fprintf(outfile, " * FILE: %s\n", outPath);
|
||||
fprintf(outfile, " * DATE: %s", today); /* no '\n' needed with ctime() */
|
||||
fprintf(outfile, " * DESCR: \n");
|
||||
fprintf(outfile, " %s/\n", lots_of_stars);
|
||||
}
|
||||
|
||||
if (!opt_i && !using_stdio)
|
||||
fprintf(outfile, "#include \"%s\"\n", inPath);
|
||||
if (opt_c)
|
||||
fprintf(outfile, "#include <iostream.h>\n");
|
||||
else if (opt_d)
|
||||
fprintf(outfile, "#include <Debug.H>\n");
|
||||
|
||||
fprintf(outfile, "\n");
|
||||
}
|
||||
|
||||
|
||||
static void debug_printf(syntaxelem_t *elt)
|
||||
{
|
||||
/*
|
||||
* Make a dummy return value if this function is not a
|
||||
* procedure (returning void) or a ctor (returning "").
|
||||
* Don't bother for references because they require an lvalue.
|
||||
*/
|
||||
int dummy_ret_val = (opt_g &&
|
||||
strcmp(elt->ret_type, "") != 0 &&
|
||||
strcmp(elt->ret_type, "void") != 0 &&
|
||||
strchr(elt->ret_type, '&') == 0);
|
||||
/*
|
||||
* If it's not a pointer type, create a temporary on the stack.
|
||||
* They'll get warnings "dummy has not yet been assigned a value"
|
||||
* from the compiler, but that's the best we can do.
|
||||
* If it's a pointer type, return NULL (we assume it's defined).
|
||||
*/
|
||||
if (dummy_ret_val != 0 && strchr(elt->ret_type, '*') == NULL)
|
||||
fprintf(outfile, " %s dummy;\n\n", elt->ret_type);
|
||||
|
||||
if (opt_c)
|
||||
fprintf(outfile, " cerr << \"%s::%s()\" << endl;\n",
|
||||
elt->parent->name, elt->name);
|
||||
else if (opt_d)
|
||||
fprintf(outfile, " dprintf((\"%s::%s()\\n\"));\n",
|
||||
elt->parent->name, elt->name);
|
||||
|
||||
if (dummy_ret_val != 0)
|
||||
fprintf(outfile, " return %s;\n",
|
||||
(strchr(elt->ret_type, '*') == NULL) ? "dummy" : "NULL");
|
||||
}
|
||||
|
||||
extern char linebuf[];
|
||||
extern int lineno;
|
||||
extern int column;
|
||||
extern int tokens_seen;
|
||||
extern int yyparse();
|
||||
|
||||
static void scan_existing_skeleton()
|
||||
{
|
||||
extern FILE *yyin;
|
||||
FILE *existing;
|
||||
|
||||
log_printf("checking for existence of %s ...\n", outPath);
|
||||
if ((existing = fopen(outPath, "r")) == NULL)
|
||||
return;
|
||||
|
||||
log_printf("%s exists, scanning skeleton...\n", outPath);
|
||||
inform_user("scanning %s ...\n", outPath);
|
||||
|
||||
lineno = 1;
|
||||
column = 0;
|
||||
tokens_seen = 0;
|
||||
|
||||
yyin = existing;
|
||||
currentFile = outPath;
|
||||
linebuf[0] = '\0';
|
||||
yyparse();
|
||||
log_printf("finished yyparse()\n");
|
||||
currentFile = "";
|
||||
|
||||
fclose(existing);
|
||||
log_printf("done scanning skeleton...\n");
|
||||
}
|
||||
|
||||
|
||||
static void scan_and_generate(FILE *infile)
|
||||
{
|
||||
extern FILE *yyin;
|
||||
|
||||
fileOpened = 0;
|
||||
lineno = 1;
|
||||
column = 0;
|
||||
tokens_seen = 0;
|
||||
|
||||
/* normal interaction on yyin and outfile from now on */
|
||||
inform_user("parsing %s ...\n", inPath);
|
||||
log_printf("parsing %s ...\n", inPath);
|
||||
yyin = infile;
|
||||
currentFile = inPath;
|
||||
linebuf[0] = '\0';
|
||||
yyparse();
|
||||
log_printf("finished yyparse()\n");
|
||||
currentFile = "";
|
||||
log_printf("expanding classes...\n");
|
||||
while (!class_queue_empty()) {
|
||||
syntaxelem_t *elt = dequeue_class();
|
||||
generate_skel(elt);
|
||||
}
|
||||
|
||||
log_printf("closing %s\n", outPath);
|
||||
free(outPath);
|
||||
outPath = NULL;
|
||||
if (fileOpened) {
|
||||
fflush(outfile);
|
||||
fclose(outfile);
|
||||
outfile = NULL;
|
||||
}
|
||||
log_printf("done with %s\n", inPath);
|
||||
}
|
||||
|
||||
/*
|
||||
* return a value representing numeric part of the RCS Revision string
|
||||
* where value == (major * 1000) + minor.
|
||||
*/
|
||||
int revision()
|
||||
{
|
||||
static char rcsrev[] = "$Revision: 1.1 $";
|
||||
static int value = -1;
|
||||
char *major_str, *dot;
|
||||
|
||||
if (value != -1)
|
||||
return value;
|
||||
|
||||
rcsrev[strlen(rcsrev)-2] = '\0';
|
||||
|
||||
major_str = &rcsrev[11];
|
||||
dot = strchr(major_str, '.');
|
||||
*dot++ = '\0'; /* tie off major_str and move to minor */
|
||||
|
||||
value = (atoi(major_str) * 1000) + atoi(dot);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
#ifndef _MAX_PATH
|
||||
#define _MAX_PATH 256
|
||||
#endif /* !def _MAX_PATH */
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
extern int optind;
|
||||
extern char *optarg;
|
||||
int c, err_flag = 0;
|
||||
char *ext;
|
||||
|
||||
#ifdef SGDEBUG
|
||||
char logfilename_buffer[_MAX_PATH];
|
||||
#ifdef WIN32
|
||||
DWORD tmpPathLen;
|
||||
#endif /* WIN32 */
|
||||
#endif /* SGDEBUG */
|
||||
|
||||
#ifdef SGDEBUG
|
||||
#ifdef WIN32
|
||||
tmpPathLen = GetTempPath(_MAX_PATH, logfilename_buffer);
|
||||
if (logfilename_buffer[tmpPathLen - 1] != '\\')
|
||||
strcat(logfilename_buffer, "\\");
|
||||
#else /* !WIN32 */
|
||||
strcpy(logfilename_buffer, "/tmp/");
|
||||
#endif /* WIN32 */
|
||||
|
||||
strcat(logfilename_buffer, sg_getlogin());
|
||||
strcat(logfilename_buffer, "-");
|
||||
strcat(logfilename_buffer, logfilename);
|
||||
|
||||
if (!log_open(logfilename_buffer)) {
|
||||
/* open failed */
|
||||
fatal(1, "%s: cannot write to %s\n", progname, logfilename_buffer);
|
||||
}
|
||||
#endif /* SGDEBUG */
|
||||
|
||||
while ((c = getopt(argc, argv, OPTS)) != EOF) {
|
||||
switch (c) {
|
||||
case 'h':
|
||||
opt_h = 1; break;
|
||||
case 'q':
|
||||
opt_q = 1; break;
|
||||
case 'v':
|
||||
opt_v = 1; break;
|
||||
case 'g':
|
||||
opt_g = 1; break;
|
||||
case 'a':
|
||||
opt_a = 1; break;
|
||||
case 'e':
|
||||
opt_e = optarg;
|
||||
if (opt_e[0] == '.')
|
||||
opt_e++;
|
||||
break;
|
||||
case 'r':
|
||||
opt_r = 1; break;
|
||||
case 'i':
|
||||
opt_i = 1; break;
|
||||
case 'c':
|
||||
if (opt_d) err_flag = 1;
|
||||
opt_c = 1; break;
|
||||
case 'd':
|
||||
if (opt_c) err_flag = 1;
|
||||
opt_d = 1; break;
|
||||
case 'b':
|
||||
if (opt_f || opt_s || opt_n) err_flag = 1;
|
||||
opt_b = 1; break;
|
||||
case 'f':
|
||||
if (opt_b || opt_s || opt_n) err_flag = 1;
|
||||
opt_f = 1; break;
|
||||
case 's':
|
||||
if (opt_f || opt_b || opt_n) err_flag = 1;
|
||||
opt_s = 1; break;
|
||||
case 'n':
|
||||
if (opt_f || opt_s || opt_b) err_flag = 1;
|
||||
opt_n = 1; break;
|
||||
default:
|
||||
err_flag = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (opt_h || opt_v || err_flag) {
|
||||
inform_user("%s version %s (build %d).\n",
|
||||
progname, progver, revision());
|
||||
if (opt_h || err_flag)
|
||||
fatal(err_flag, usage, progname);
|
||||
else
|
||||
fatal(0, "%s\n%s", copyright, version_info);
|
||||
}
|
||||
|
||||
if (!(opt_b || opt_f || opt_s || opt_n))
|
||||
opt_b = 1;
|
||||
|
||||
/* done setting options */
|
||||
if (argc == optind) {
|
||||
/* read from stdin and stdout */
|
||||
outfile = stdout;
|
||||
fprintf(outfile, "/* %s: reading from stdin */\n", progname);
|
||||
using_stdio = 1;
|
||||
inPath = "stdin";
|
||||
outPath = strdup("stdout");
|
||||
|
||||
opt_q = 1; /* force quiet mode */
|
||||
log_printf("initting...\n");
|
||||
init_tables();
|
||||
scan_and_generate(stdin);
|
||||
log_printf("freeing memory...\n");
|
||||
free_tables();
|
||||
|
||||
} else {
|
||||
inform_user("%s version %s (build %d).\n",
|
||||
progname, progver, revision());
|
||||
|
||||
/* each bloody file from the command line */
|
||||
while (optind < argc) {
|
||||
FILE *infile;
|
||||
log_printf("working on %s\n", argv[optind]);
|
||||
/* open for read */
|
||||
infile = fopen(argv[optind], "r");
|
||||
if (infile == NULL) {
|
||||
/* open failed */
|
||||
fatal(1, "%s: cannot open %s\n", progname, argv[optind]);
|
||||
}
|
||||
|
||||
inPath = basename(argv[optind]);
|
||||
outPath = (char *)malloc(strlen(inPath) + strlen(opt_e) + 2);
|
||||
strcpy(outPath, inPath);
|
||||
|
||||
/* tie off .h, .hh, .hpp, or .hxx extension */
|
||||
if (((ext = strrchr(outPath, '.')) != NULL) &&
|
||||
(((strlen(ext) == 2) &&
|
||||
((ext[1] == 'H') || (ext[1] == 'h'))) ||
|
||||
(((strlen(ext) == 3) &&
|
||||
((ext[1] == 'H') || (ext[1] == 'h')) &&
|
||||
((ext[2] == 'H') || (ext[2] == 'h')))) ||
|
||||
((strlen(ext) == 4) &&
|
||||
((ext[1] == 'H') || (ext[1] == 'h')) &&
|
||||
((((ext[2] == 'P') || (ext[2] == 'p')) &&
|
||||
((ext[3] == 'P') || (ext[3] == 'p'))) ||
|
||||
(((ext[2] == 'X') || (ext[2] == 'x')) &&
|
||||
((ext[3] == 'X') || (ext[3] == 'x')))))))
|
||||
*ext = '\0';
|
||||
|
||||
assert(opt_e[0] != '.');
|
||||
strcat(outPath, ".");
|
||||
strcat(outPath, opt_e);
|
||||
|
||||
log_printf("initting...\n");
|
||||
init_tables();
|
||||
scan_existing_skeleton();
|
||||
scan_and_generate(infile);
|
||||
log_printf("freeing memory...\n");
|
||||
free_tables();
|
||||
clear_skeleton_queue();
|
||||
fclose(infile);
|
||||
optind++;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef SGDEBUG
|
||||
log_flush();
|
||||
log_close();
|
||||
#endif /* SGDEBUG */
|
||||
|
||||
return 0;
|
||||
}
|
||||
1784
bepascal/bepascal/stubgen/parser.y
Normal file
1784
bepascal/bepascal/stubgen/parser.y
Normal file
File diff suppressed because it is too large
Load Diff
86
bepascal/bepascal/stubgen/pathname.c
Normal file
86
bepascal/bepascal/stubgen/pathname.c
Normal file
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* FILE: pathname.c
|
||||
* AUTH: Michael John Radwin <mjr@acm.org>
|
||||
*
|
||||
* DESC: two important functions from libgen. Largely influenced
|
||||
* by the gnu dirutils.
|
||||
*
|
||||
* DATE: Tue Oct 1 20:48:28 EDT 1996
|
||||
* $Id: pathname.c,v 1.1 2002-06-06 22:09:16 ocoursiere Exp $
|
||||
*
|
||||
* Copyright (c) 1996-1998 Michael John Radwin
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#define PATH_SEPARATOR_STR "\\"
|
||||
#define PATH_SEPARATOR_CHAR '\\'
|
||||
#else
|
||||
#define PATH_SEPARATOR_STR "/"
|
||||
#define PATH_SEPARATOR_CHAR '/'
|
||||
#endif
|
||||
|
||||
static const char rcsid[] = "$Id: pathname.c,v 1.1 2002-06-06 22:09:16 ocoursiere Exp $";
|
||||
|
||||
static void
|
||||
strip_trailing_slashes(char *path)
|
||||
{
|
||||
int last = strlen (path) - 1;
|
||||
while ((last > 0) && (path[last] == PATH_SEPARATOR_CHAR))
|
||||
path[last--] = '\0';
|
||||
}
|
||||
|
||||
char *
|
||||
basename(char *path)
|
||||
{
|
||||
char *slash;
|
||||
|
||||
if ((path == NULL) || (path[0] == '\0'))
|
||||
return ".";
|
||||
|
||||
strip_trailing_slashes(path);
|
||||
if (path[0] == '\0')
|
||||
return PATH_SEPARATOR_STR;
|
||||
|
||||
slash = strrchr(path, PATH_SEPARATOR_CHAR);
|
||||
return (slash) ? slash + 1 : path;
|
||||
}
|
||||
|
||||
char *
|
||||
dirname(char *path)
|
||||
{
|
||||
char *slash;
|
||||
|
||||
if ((path == NULL) || (path[0] == '\0'))
|
||||
return ".";
|
||||
|
||||
strip_trailing_slashes(path);
|
||||
if (path[0] == '\0')
|
||||
return PATH_SEPARATOR_STR;
|
||||
|
||||
slash = strrchr(path, PATH_SEPARATOR_CHAR);
|
||||
if (slash == NULL)
|
||||
return ".";
|
||||
|
||||
/* Remove any trailing slashes and final element. */
|
||||
while (slash > path && *slash == PATH_SEPARATOR_CHAR)
|
||||
--slash;
|
||||
slash[1] = 0;
|
||||
|
||||
return path;
|
||||
}
|
||||
70
bepascal/bepascal/stubgen/pathname.h
Normal file
70
bepascal/bepascal/stubgen/pathname.h
Normal file
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* FILE: pathname.h
|
||||
* AUTH: Michael John Radwin <mjr@acm.org>
|
||||
*
|
||||
* DESC: two important functions from libgen
|
||||
*
|
||||
* DATE: Tue Oct 1 20:47:55 EDT 1996
|
||||
* $Id: pathname.h,v 1.1 2002-06-06 22:09:16 ocoursiere Exp $
|
||||
*
|
||||
* Copyright (c) 1996-1998 Michael John Radwin
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef __pathname_H__
|
||||
#define __pathname_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Given a pointer to a null-terminated character string that contains a
|
||||
* path name, basename() returns a pointer to the last element of path.
|
||||
* Trailing ``/'' characters are deleted. In doing this, it may place a
|
||||
* null byte in the path name after the next to last element, so the
|
||||
* content of path must be disposable.
|
||||
*
|
||||
* If path or *path is zero, pointer to a static constant ``.'' is
|
||||
* returned.
|
||||
*
|
||||
* If path consists entirely of ``/'' characters, the empty string is
|
||||
* returned.
|
||||
*/
|
||||
char * basename(char *path);
|
||||
|
||||
/*
|
||||
* Given a pointer to a null-terminated character string that contains a
|
||||
* file system path name, dirname() returns a string that is the parent
|
||||
* directory of that file. In doing this, it may place a null byte in
|
||||
* the path name after the next to last element, so the content of path
|
||||
* must be disposable. The returned string should not be deallocated by
|
||||
* the caller. Trailing ``/'' characters in the path are not counted as
|
||||
* part of the path.
|
||||
*
|
||||
* If path or *path is zero, a pointer to a static constant ``.'' is
|
||||
* returned.
|
||||
*
|
||||
* dirname() and basename() together yield a complete path name.
|
||||
* dirname (path) is the directory where basename (path) is found.
|
||||
*/
|
||||
char * dirname(char *path);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __pathname_H__ */
|
||||
498
bepascal/bepascal/stubgen/table.c
Normal file
498
bepascal/bepascal/stubgen/table.c
Normal file
@@ -0,0 +1,498 @@
|
||||
/*
|
||||
* FILE: table.c
|
||||
* AUTH: Michael John Radwin <mjr@acm.org>
|
||||
*
|
||||
* DESC: stubgen symbol table goodies
|
||||
*
|
||||
* DATE: 1996/08/14 22:04:47
|
||||
* $Id: table.c,v 1.1 2002-06-06 22:09:16 ocoursiere Exp $
|
||||
*
|
||||
* Copyright (c) 1996-1998 Michael John Radwin
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "table.h"
|
||||
#include "util.h"
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
||||
static const char rcsid[] = "$Id: table.c,v 1.1 2002-06-06 22:09:16 ocoursiere Exp $";
|
||||
|
||||
/* global table */
|
||||
static syntaxelem_t etable[NELEMS];
|
||||
static int eindex;
|
||||
|
||||
/* initializes all of the tables to default values. */
|
||||
void init_tables()
|
||||
{
|
||||
memset(etable, 0, sizeof(syntaxelem_t) * NELEMS);
|
||||
eindex = 0;
|
||||
|
||||
#if 0
|
||||
syntaxelem_t *elt;
|
||||
|
||||
for(elt = etable; elt < &etable[NELEMS]; elt++) {
|
||||
elt->name = NULL;
|
||||
elt->ret_type = NULL;
|
||||
elt->args = NULL;
|
||||
elt->templ = NULL;
|
||||
elt->parent = NULL;
|
||||
elt->children = NULL;
|
||||
elt->throw_decl = NULL;
|
||||
elt->const_flag = 0;
|
||||
elt->kind = 73;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* recursively frees all syntaxelem_t's. */
|
||||
void free_tables()
|
||||
{
|
||||
syntaxelem_t *elt;
|
||||
|
||||
for (elt = etable; elt < &etable[NELEMS]; elt++) {
|
||||
if (elt->name) {
|
||||
free(elt->name);
|
||||
free(elt->ret_type);
|
||||
free_args(elt->args);
|
||||
|
||||
if (elt->throw_decl) free(elt->throw_decl);
|
||||
if (elt->templ) free(elt->templ);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* recursively frees the argument list and assoicated fields */
|
||||
void free_args(arg_t *args)
|
||||
{
|
||||
arg_t *a;
|
||||
|
||||
for (a = args; a != NULL; ) {
|
||||
arg_t *next_arg = a->next;
|
||||
free(a->type);
|
||||
if (a->name)
|
||||
free(a->name);
|
||||
if (a->array)
|
||||
free(a->array);
|
||||
free(a);
|
||||
a = next_arg;
|
||||
}
|
||||
}
|
||||
|
||||
/* compares two arguments for equality. Returns 0 for equal,
|
||||
non-zero if they differ. */
|
||||
int arg_cmp(arg_t *a1, arg_t *a2)
|
||||
{
|
||||
if (strcmp(a1->type, a2->type) != 0)
|
||||
return 1;
|
||||
|
||||
if (a1->array) {
|
||||
if (a2->array) {
|
||||
if (strcmp(a1->array, a2->array) != 0)
|
||||
return 1;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
} else if (a2->array) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* recursively compares two argument lists for equality.
|
||||
Returns 0 for equal, non-zero if they differ. */
|
||||
int args_cmp(arg_t *a1, arg_t *a2)
|
||||
{
|
||||
while (a1 != NULL) {
|
||||
if (a2 == NULL)
|
||||
return 1;
|
||||
|
||||
if (arg_cmp(a1, a2) != 0)
|
||||
return 1;
|
||||
|
||||
a1 = a1->next;
|
||||
a2 = a2->next;
|
||||
}
|
||||
|
||||
if (a2 != NULL)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// OCO
|
||||
/* provides a string rep of this arglist. conses up new
|
||||
memory, so client is responsible for freeing it. */
|
||||
char * args_to_string_name(arg_t *args, int indent_length)
|
||||
{
|
||||
arg_t *a;
|
||||
int len = 0;
|
||||
char *str;
|
||||
char *indent_str;
|
||||
|
||||
if (indent_length <= 0) {
|
||||
indent_str = strdup(", ");
|
||||
indent_length = 2;
|
||||
|
||||
} else {
|
||||
indent_length += 2; /* room for ",\n" as well */
|
||||
indent_str = (char *) malloc(indent_length + 1);
|
||||
memset(indent_str, ' ', indent_length);
|
||||
indent_str[0] = ',';
|
||||
indent_str[1] = '\n';
|
||||
indent_str[indent_length] = '\0';
|
||||
}
|
||||
|
||||
for (a = args; a != NULL; a = a->next) {
|
||||
// len += strlen(a->type); /* we always have a type */
|
||||
if (a->name)
|
||||
len += (1 + strlen(a->name)); /* room for ' ' and name */
|
||||
if (a->array)
|
||||
len += strlen(a->array);
|
||||
if (a != args)
|
||||
len += indent_length; /* room for ", " */
|
||||
}
|
||||
|
||||
str = (char *) malloc(len + 1);
|
||||
str[0] = '\0';
|
||||
|
||||
for (a = args; a != NULL; a = a->next) {
|
||||
if (a != args)
|
||||
strcat(str, indent_str);
|
||||
|
||||
// strcat(str, a->type);
|
||||
if (a->name) {
|
||||
// if (((a->type)[strlen(a->type)-1] != '*') &&
|
||||
// ((a->type)[strlen(a->type)-1] != '&'))
|
||||
// strcat(str, " ");
|
||||
strcat(str, a->name);
|
||||
if (a->array)
|
||||
strcat(str, a->array); /* array hugs variable name */
|
||||
} else {
|
||||
// if (a->array)
|
||||
// strcat(str, a->array); /* array hugs type name */
|
||||
}
|
||||
}
|
||||
|
||||
free(indent_str);
|
||||
return str;
|
||||
}
|
||||
|
||||
/* provides a string rep of this arglist. conses up new
|
||||
memory, so client is responsible for freeing it. */
|
||||
char * args_to_string(arg_t *args, int indent_length)
|
||||
{
|
||||
arg_t *a;
|
||||
int len = 0;
|
||||
char *str;
|
||||
char *indent_str;
|
||||
|
||||
if (indent_length <= 0) {
|
||||
indent_str = strdup(", ");
|
||||
indent_length = 2;
|
||||
|
||||
} else {
|
||||
indent_length += 2; /* room for ",\n" as well */
|
||||
indent_str = (char *) malloc(indent_length + 1);
|
||||
memset(indent_str, ' ', indent_length);
|
||||
indent_str[0] = ',';
|
||||
indent_str[1] = '\n';
|
||||
indent_str[indent_length] = '\0';
|
||||
}
|
||||
|
||||
for (a = args; a != NULL; a = a->next) {
|
||||
len += strlen(a->type); /* we always have a type */
|
||||
if (a->name)
|
||||
len += (1 + strlen(a->name)); /* room for ' ' and name */
|
||||
if (a->array)
|
||||
len += strlen(a->array);
|
||||
if (a != args)
|
||||
len += indent_length; /* room for ", " */
|
||||
}
|
||||
|
||||
str = (char *) malloc(len + 1);
|
||||
str[0] = '\0';
|
||||
|
||||
for (a = args; a != NULL; a = a->next) {
|
||||
if (a != args)
|
||||
strcat(str, indent_str);
|
||||
|
||||
strcat(str, a->type);
|
||||
if (a->name) {
|
||||
if (((a->type)[strlen(a->type)-1] != '*') &&
|
||||
((a->type)[strlen(a->type)-1] != '&'))
|
||||
strcat(str, " ");
|
||||
strcat(str, a->name);
|
||||
if (a->array)
|
||||
strcat(str, a->array); /* array hugs variable name */
|
||||
} else {
|
||||
if (a->array)
|
||||
strcat(str, a->array); /* array hugs type name */
|
||||
}
|
||||
}
|
||||
|
||||
free(indent_str);
|
||||
return str;
|
||||
}
|
||||
|
||||
/* compares a skeleton element to a header element for equality of
|
||||
signatures. this isn't a strict comparison, because the kind and
|
||||
parent fields ought to be different. returns 0 if equal, non-zero if
|
||||
different */
|
||||
int skel_elemcmp(syntaxelem_t *skel_elem, syntaxelem_t *hdr_elem)
|
||||
{
|
||||
char *tmp_str;
|
||||
int result;
|
||||
|
||||
assert(hdr_elem->kind == FUNC_KIND);
|
||||
assert(skel_elem->kind == SKEL_KIND);
|
||||
assert(hdr_elem->parent != NULL);
|
||||
|
||||
if (skel_elem->const_flag != hdr_elem->const_flag)
|
||||
return 1;
|
||||
|
||||
/*
|
||||
* templ and throw_decl are allowed to be NULL,
|
||||
* so we must not pass them onto strcmp without
|
||||
* a check first.
|
||||
*/
|
||||
if (skel_elem->templ != NULL) {
|
||||
if (hdr_elem->templ == NULL)
|
||||
return 1;
|
||||
else if (strcmp(skel_elem->templ, hdr_elem->templ) != 0)
|
||||
return 1;
|
||||
} else if (hdr_elem->templ != NULL) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (skel_elem->throw_decl != NULL) {
|
||||
if (hdr_elem->throw_decl == NULL)
|
||||
return 1;
|
||||
else if (strcmp(skel_elem->throw_decl, hdr_elem->throw_decl) != 0)
|
||||
return 1;
|
||||
} else if (hdr_elem->throw_decl != NULL) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* these two won't differ across files, and they're
|
||||
* guaranteed not to be NULL.
|
||||
*/
|
||||
if (strcmp(skel_elem->ret_type, hdr_elem->ret_type) != 0)
|
||||
return 1;
|
||||
|
||||
/* now make sure the argument signatures match */
|
||||
if (args_cmp(skel_elem->args, hdr_elem->args) != 0)
|
||||
return 1;
|
||||
|
||||
/*
|
||||
* the name, of course, is the hard part. we gotta
|
||||
* look at the parent to make a scoped name.
|
||||
*/
|
||||
tmp_str = (char *) malloc(strlen(hdr_elem->parent->name) +
|
||||
strlen(hdr_elem->name) + 3);
|
||||
sprintf(tmp_str, "%s::%s", hdr_elem->parent->name, hdr_elem->name);
|
||||
|
||||
result = strcmp(skel_elem->name, tmp_str);
|
||||
free(tmp_str);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* allocates a new element from the table, filling in the apropriate fields */
|
||||
syntaxelem_t * new_elem(char *ret_type, char *name, arg_t *args, int kind)
|
||||
{
|
||||
syntaxelem_t *se;
|
||||
|
||||
if (eindex == NELEMS - 1) {
|
||||
fatal(2, "Too many symbols. Please mail mjr@acm.org.");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
se = &etable[eindex++];
|
||||
se->ret_type = ret_type;
|
||||
se->name = name;
|
||||
se->args = args;
|
||||
se->kind = kind;
|
||||
|
||||
return se;
|
||||
}
|
||||
|
||||
|
||||
/* given the head of the list, reverses it and returns the new head */
|
||||
syntaxelem_t * reverse_list(syntaxelem_t *head)
|
||||
{
|
||||
syntaxelem_t *elt = head;
|
||||
syntaxelem_t *prev = NULL;
|
||||
syntaxelem_t *next;
|
||||
|
||||
while (elt != NULL) {
|
||||
next = elt->next;
|
||||
elt->next = prev;
|
||||
prev = elt;
|
||||
elt = next;
|
||||
}
|
||||
|
||||
return prev;
|
||||
}
|
||||
|
||||
arg_t * reverse_arg_list(arg_t *head)
|
||||
{
|
||||
arg_t *a = head;
|
||||
arg_t *prev = NULL;
|
||||
arg_t *next;
|
||||
|
||||
while (a != NULL) {
|
||||
next = a->next;
|
||||
a->next = prev;
|
||||
prev = a;
|
||||
a = next;
|
||||
}
|
||||
|
||||
return prev;
|
||||
}
|
||||
|
||||
const char * string_kind(int some_KIND)
|
||||
{
|
||||
switch(some_KIND) {
|
||||
case IGNORE_KIND:
|
||||
return "IGNORE_KIND";
|
||||
case FUNC_KIND:
|
||||
return "FUNC_KIND";
|
||||
case CLASS_KIND:
|
||||
return "CLASS_KIND";
|
||||
case STRUCT_KIND:
|
||||
return "STRUCT_KIND";
|
||||
case INLINED_KIND:
|
||||
return "INLINED_KIND";
|
||||
case SKEL_KIND:
|
||||
return "SKEL_KIND";
|
||||
case DONE_FUNC_KIND:
|
||||
return "DONE_FUNC_KIND";
|
||||
case DONE_CLASS_KIND:
|
||||
return "DONE_CLASS_KIND";
|
||||
default:
|
||||
return "BAD KIND!";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#ifdef SGDEBUG
|
||||
void print_se(syntaxelem_t *elt)
|
||||
{
|
||||
char *arg_str = args_to_string(elt->args, 0);
|
||||
|
||||
log_printf("\nSTUBELEM name: %s\n", elt->name);
|
||||
log_printf(" ret_typ: %s\n", elt->ret_type);
|
||||
log_printf(" args: %s\n", arg_str);
|
||||
log_printf(" parent: %s\n", (elt->parent) ? elt->parent->name : "NULL");
|
||||
log_printf(" next: %s\n", (elt->next) ? elt->next->name : "NULL");
|
||||
log_printf(" const: %d\n", elt->const_flag);
|
||||
log_printf(" kind: %s\n", string_kind(elt->kind));
|
||||
log_printf(" throw: %s\n", (elt->throw_decl)? elt->throw_decl : "NULL");
|
||||
log_printf(" templ: %s\n\n", (elt->templ)? elt->templ : "NULL");
|
||||
free(arg_str);
|
||||
}
|
||||
#endif /* SGDEBUG */
|
||||
|
||||
/*
|
||||
* we can't use the 'next' field of syntaxelem_t because it is used to
|
||||
* chain together methods. Make a slightly bigger struct so we can
|
||||
* queue these up.
|
||||
*/
|
||||
typedef struct _skelnode {
|
||||
syntaxelem_t *elt;
|
||||
struct _skelnode *next;
|
||||
} skelnode_t;
|
||||
|
||||
/* the queue of elements found in the .H file, possibly to be expanded */
|
||||
static skelnode_t *exp_head = NULL;
|
||||
static skelnode_t *exp_tail = NULL;
|
||||
|
||||
void enqueue_class(syntaxelem_t *elt)
|
||||
{
|
||||
skelnode_t *new_class;
|
||||
|
||||
new_class = (skelnode_t *)malloc(sizeof(skelnode_t));
|
||||
new_class->elt = elt;
|
||||
new_class->next = NULL;
|
||||
|
||||
if (exp_head == NULL)
|
||||
exp_tail = exp_head = new_class;
|
||||
else {
|
||||
exp_tail->next = new_class;
|
||||
exp_tail = new_class;
|
||||
}
|
||||
}
|
||||
|
||||
syntaxelem_t * dequeue_class()
|
||||
{
|
||||
skelnode_t *old_head = exp_head;
|
||||
syntaxelem_t *to_return = exp_head->elt;
|
||||
|
||||
assert(exp_head != NULL);
|
||||
exp_head = exp_head->next;
|
||||
free(old_head);
|
||||
|
||||
return to_return;
|
||||
}
|
||||
|
||||
int class_queue_empty()
|
||||
{
|
||||
return exp_head == NULL;
|
||||
}
|
||||
|
||||
/* the list of skeletons found in the .C file, already expanded */
|
||||
static skelnode_t *skel_head = NULL;
|
||||
|
||||
void enqueue_skeleton(syntaxelem_t *elt)
|
||||
{
|
||||
skelnode_t *new_class;
|
||||
|
||||
new_class = (skelnode_t *)malloc(sizeof(skelnode_t));
|
||||
new_class->elt = elt;
|
||||
new_class->next = skel_head;
|
||||
|
||||
skel_head = new_class;
|
||||
}
|
||||
|
||||
syntaxelem_t * find_skeleton(syntaxelem_t *elt)
|
||||
{
|
||||
skelnode_t *node;
|
||||
|
||||
/* the order of skel_elemcmp(node->elt, elt) is important. */
|
||||
for (node = skel_head; node != NULL; node = node->next)
|
||||
if (skel_elemcmp(node->elt, elt) == 0)
|
||||
return node->elt;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void clear_skeleton_queue()
|
||||
{
|
||||
skelnode_t *node = skel_head;
|
||||
|
||||
while (node != NULL) {
|
||||
skelnode_t *next_node = node->next;
|
||||
free(node);
|
||||
node = next_node;
|
||||
}
|
||||
|
||||
skel_head = NULL;
|
||||
}
|
||||
121
bepascal/bepascal/stubgen/table.h
Normal file
121
bepascal/bepascal/stubgen/table.h
Normal file
@@ -0,0 +1,121 @@
|
||||
/*
|
||||
* FILE: table.h
|
||||
* AUTH: Michael John Radwin <mjr@acm.org>
|
||||
*
|
||||
* DESC: stubgen symbol table goodies
|
||||
*
|
||||
* DATE: 1996/08/14 22:04:47
|
||||
* $Id: table.h,v 1.1 2002-06-06 22:09:16 ocoursiere Exp $
|
||||
*
|
||||
* Copyright (c) 1996-1998 Michael John Radwin
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef TABLE_HEADER
|
||||
#define TABLE_HEADER
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define NELEMS 500 /* maximum number of symbols */
|
||||
|
||||
#define IGNORE_KIND 0 /* a variable or forward declaration */
|
||||
#define FUNC_KIND 1 /* a method declaration */
|
||||
#define CLASS_KIND 2 /* a class declaration */
|
||||
#define INLINED_KIND 3 /* a method w/body in a class decl. */
|
||||
#define SKEL_KIND 4 /* a method found in a code file */
|
||||
#define STRUCT_KIND 5 /* a struct declaration that's a class */
|
||||
#define DONE_FUNC_KIND 11 /* a fn that we've finished expanded */
|
||||
#define DONE_CLASS_KIND 12 /* a class that we've finished expanded */
|
||||
|
||||
/* returns a pointer to a static string */
|
||||
const char * string_kind(int some_KIND);
|
||||
|
||||
/*
|
||||
* Represents a single argument, often used in a list.
|
||||
*/
|
||||
typedef struct arg {
|
||||
char *type; /* type of this arg. may NOT be NULL */
|
||||
char *name; /* formal parameter name. may be NULL */
|
||||
char *array; /* any array dimensions may be NULL
|
||||
appended to name. */
|
||||
struct arg *next; /* next argument. may be NULL */
|
||||
} arg_t;
|
||||
|
||||
/*
|
||||
* This structure is central to the program. It might have been more
|
||||
* elegant with an object-oriented approach consisting of the following
|
||||
* objects: ignore, method, class, inlined, skeleton.
|
||||
*
|
||||
* Instead, however, we have a "throw-it-all-in-one" structure that has
|
||||
* unused pieces of data, depending on the kind field.
|
||||
*
|
||||
* A syntaxelem_t is "valid" if the name field is non-NULL.
|
||||
*/
|
||||
typedef struct syntaxelem {
|
||||
char *name; /* name of class or func. may NOT be NULL */
|
||||
char *ret_type; /* return type. may NOT be NULL */
|
||||
arg_t *args; /* argument list. may be NULL */
|
||||
char *templ; /* template declaration. may be NULL */
|
||||
struct syntaxelem *parent; /* parent class */
|
||||
struct syntaxelem *next; /* next class or member */
|
||||
struct syntaxelem *children; /* children of this class */
|
||||
char *throw_decl; /* throw() clause. may be NULL */
|
||||
int const_flag; /* 1 if the func is const, 0 if not. */
|
||||
int kind; /* some_KIND */
|
||||
} syntaxelem_t;
|
||||
|
||||
/* defined in table.c */
|
||||
void init_tables();
|
||||
void free_tables();
|
||||
|
||||
#ifdef SGDEBUG
|
||||
void print_se(syntaxelem_t *);
|
||||
#else
|
||||
#define print_se(arg)
|
||||
#endif /* SGDEBUG */
|
||||
|
||||
/* used in scanning */
|
||||
arg_t * reverse_arg_list(arg_t *);
|
||||
void free_args(arg_t *);
|
||||
syntaxelem_t *new_elem(char *, char *, arg_t *, int);
|
||||
syntaxelem_t *reverse_list(syntaxelem_t *);
|
||||
|
||||
/* used in generating output.
|
||||
allocates memory; someone's gotta clean it up! */
|
||||
char *args_to_string(arg_t *, int);
|
||||
|
||||
char * args_to_string_name(arg_t *, int);
|
||||
|
||||
/* used in comparison with existing skeletons*/
|
||||
int skel_elemcmp(syntaxelem_t *skel_elem, syntaxelem_t *hdr_elem);
|
||||
int strict_elemcmp(syntaxelem_t *e1, syntaxelem_t *e2);
|
||||
|
||||
/* list management primitives */
|
||||
void enqueue_class(syntaxelem_t *);
|
||||
syntaxelem_t * dequeue_class();
|
||||
int class_queue_empty();
|
||||
|
||||
void enqueue_skeleton(syntaxelem_t *);
|
||||
syntaxelem_t * find_skeleton(syntaxelem_t *);
|
||||
void clear_skeleton_queue();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* TABLE_HEADER */
|
||||
147
bepascal/bepascal/stubgen/util.c
Normal file
147
bepascal/bepascal/stubgen/util.c
Normal file
@@ -0,0 +1,147 @@
|
||||
/*
|
||||
* FILE: util.c
|
||||
* AUTH: Michael John Radwin <mjr@acm.org>
|
||||
*
|
||||
* DESC: stubgen utility macros and funcs
|
||||
*
|
||||
* DATE: Wed Sep 11 23:31:55 EDT 1996
|
||||
* $Id: util.c,v 1.1 2002-06-06 22:09:16 ocoursiere Exp $
|
||||
*
|
||||
* Copyright (c) 1996-1998 Michael John Radwin
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include "util.h"
|
||||
|
||||
static const char rcsid[] = "$Id: util.c,v 1.1 2002-06-06 22:09:16 ocoursiere Exp $";
|
||||
|
||||
#ifdef SGDEBUG
|
||||
static FILE *logfile;
|
||||
|
||||
int log_open(const char *logfilename)
|
||||
{
|
||||
logfile = fopen(logfilename, "w");
|
||||
return (logfile != NULL);
|
||||
}
|
||||
|
||||
void log_flush()
|
||||
{
|
||||
fflush(logfile);
|
||||
}
|
||||
|
||||
void log_close()
|
||||
{
|
||||
fclose(logfile);
|
||||
logfile = NULL;
|
||||
}
|
||||
|
||||
int log_printf(const char *format, ...)
|
||||
{
|
||||
int retval;
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, format);
|
||||
retval = vfprintf(logfile, format, ap);
|
||||
va_end(ap);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
int log_vprintf(const char *format, va_list ap)
|
||||
{
|
||||
return vfprintf(logfile, format, ap);
|
||||
}
|
||||
|
||||
#else
|
||||
int log_printf(const char *format /*UNUSED*/, ...)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif /* SGDEBUG */
|
||||
|
||||
|
||||
int inform_user(const char *format, ...)
|
||||
{
|
||||
extern int opt_q;
|
||||
int retval = 0;
|
||||
va_list ap;
|
||||
|
||||
if (!opt_q) {
|
||||
va_start(ap, format);
|
||||
retval = vfprintf(stderr, format, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
void fatal(int status, const char *format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, format);
|
||||
log_vprintf(format, ap);
|
||||
log_flush();
|
||||
log_close();
|
||||
(void) vfprintf(stderr, format, ap);
|
||||
va_end(ap);
|
||||
|
||||
fprintf(stderr, "\n");
|
||||
exit(status);
|
||||
}
|
||||
|
||||
#if 0 /* removeDefaultValues() not needed */
|
||||
/*
|
||||
* modifies s by putting a null char in place of the first trailing space
|
||||
*/
|
||||
static void removeTrailingSpaces(char *s)
|
||||
{
|
||||
char *end = s + strlen(s) - 1;
|
||||
char *orig_end = end;
|
||||
|
||||
while(*end == ' ') end--;
|
||||
if (end != orig_end) *++end = '\0';
|
||||
}
|
||||
|
||||
/*
|
||||
* this both destructively modifies args and conses up a new string.
|
||||
* be sure to free it up.
|
||||
*/
|
||||
char * removeDefaultValues(char *args)
|
||||
{
|
||||
char *token;
|
||||
char *new_arglist = (char *) malloc(strlen(args) + 1);
|
||||
int once = 0;
|
||||
|
||||
strcpy(new_arglist, "");
|
||||
token = strtok(args, "=");
|
||||
|
||||
while(token != NULL) {
|
||||
/* only append a comma if strtok got the comma off the arglist */
|
||||
if (once++) strcat(new_arglist, ",");
|
||||
removeTrailingSpaces(token);
|
||||
strcat(new_arglist, token);
|
||||
token = strtok(NULL, ","); /* throw away the constant value */
|
||||
token = strtok(NULL, "="); /* grab args up til the next = sign */
|
||||
}
|
||||
|
||||
return new_arglist;
|
||||
}
|
||||
#endif /* removeDefaultValues() not needed */
|
||||
63
bepascal/bepascal/stubgen/util.h
Normal file
63
bepascal/bepascal/stubgen/util.h
Normal file
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* FILE: util.h
|
||||
* AUTH: Michael John Radwin <mjr@acm.org>
|
||||
*
|
||||
* DESC: stubgen utility macros and funcs
|
||||
*
|
||||
* DATE: Wed Sep 11 23:31:55 EDT 1996
|
||||
* $Id: util.h,v 1.1 2002-06-06 22:09:16 ocoursiere Exp $
|
||||
*
|
||||
* Copyright (c) 1996-1998 Michael John Radwin
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef UTIL_HEADER
|
||||
#define UTIL_HEADER
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
extern int yylex();
|
||||
|
||||
/* prints a message to the logfile if debugging is enabled */
|
||||
int log_printf(const char *format, ...);
|
||||
|
||||
#ifdef SGDEBUG
|
||||
int log_vprintf(const char *format, va_list ap);
|
||||
int log_open(const char *filename);
|
||||
void log_flush();
|
||||
void log_close();
|
||||
#else
|
||||
#define log_vprintf(a,b)
|
||||
#define log_open(arg)
|
||||
#define log_flush()
|
||||
#define log_close()
|
||||
#endif /* SGDEBUG */
|
||||
|
||||
/* prints a message to stderr if the -q option is not set */
|
||||
int inform_user(const char *format, ...);
|
||||
|
||||
/* prints a message to stderr and exits with return value 1 */
|
||||
void fatal(int status, const char *format, ...);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* UTIL_HEADER */
|
||||
3309
bepascal/bepascal/stubgen/y.tab.c
Normal file
3309
bepascal/bepascal/stubgen/y.tab.c
Normal file
File diff suppressed because it is too large
Load Diff
60
bepascal/bepascal/stubgen/y.tab.h
Normal file
60
bepascal/bepascal/stubgen/y.tab.h
Normal file
@@ -0,0 +1,60 @@
|
||||
typedef union {
|
||||
char *string;
|
||||
syntaxelem_t *elt;
|
||||
arg_t *arg;
|
||||
int flag;
|
||||
} YYSTYPE;
|
||||
#define IDENTIFIER 257
|
||||
#define CONSTANT 258
|
||||
#define STRING_LITERAL 259
|
||||
#define CHAR 260
|
||||
#define SHORT 261
|
||||
#define INT 262
|
||||
#define LONG 263
|
||||
#define SIGNED 264
|
||||
#define UNSIGNED 265
|
||||
#define FLOAT 266
|
||||
#define DOUBLE 267
|
||||
#define VOID 268
|
||||
#define NEW 269
|
||||
#define DELETE 270
|
||||
#define TEMPLATE 271
|
||||
#define THROW 272
|
||||
#define PTR_OP 273
|
||||
#define INC_OP 274
|
||||
#define DEC_OP 275
|
||||
#define LEFT_OP 276
|
||||
#define RIGHT_OP 277
|
||||
#define LE_OP 278
|
||||
#define GE_OP 279
|
||||
#define EQ_OP 280
|
||||
#define NE_OP 281
|
||||
#define AND_OP 282
|
||||
#define OR_OP 283
|
||||
#define MUL_ASSIGN 284
|
||||
#define DIV_ASSIGN 285
|
||||
#define MOD_ASSIGN 286
|
||||
#define ADD_ASSIGN 287
|
||||
#define SUB_ASSIGN 288
|
||||
#define LEFT_ASSIGN 289
|
||||
#define RIGHT_ASSIGN 290
|
||||
#define AND_ASSIGN 291
|
||||
#define XOR_ASSIGN 292
|
||||
#define OR_ASSIGN 293
|
||||
#define CLCL 294
|
||||
#define MEM_PTR_OP 295
|
||||
#define FRIEND 296
|
||||
#define OPERATOR 297
|
||||
#define CONST 298
|
||||
#define CLASS 299
|
||||
#define STRUCT 300
|
||||
#define UNION 301
|
||||
#define ENUM 302
|
||||
#define PROTECTED 303
|
||||
#define PRIVATE 304
|
||||
#define PUBLIC 305
|
||||
#define EXTERN 306
|
||||
#define ELIPSIS 307
|
||||
|
||||
|
||||
extern YYSTYPE yylval;
|
||||
Reference in New Issue
Block a user